# 面向对象的三大特点
![](https://box.kancloud.cn/441e34cbb7a5d3c8bfd5d2c6864f4fa6_677x340.png)
属性必须指定修饰符,方法默认是public
函数之间可以互相调用,但需要用this指向
## 封装
姓名,性别公开,电话号码,工资是隐私的。
访问proteced,private的变量,使用下面**魔术方法**:
__set(), __get();
### 赋值操作:
`__set($name,$value);`
### 获取属性的值
`__get($name);`
~~~
//set get无法单独效验,虽然方便,但无法个性化
class A{
private $n1;
private $n2;
//set管理所有私有属性
public function __set($pro_name,$pro_val){
$this->pro_name=$pro_val;
}
//获取所有属性的值
public function __get($pro_name){
if(isset($pro_name)){
return $this->pro_name;
}else{
return null;
}
}
public function add($n1){
$this->n1=$n1;
$this->n2=$n2;
}
}
$aa=new A();
$aa->n1="dddd";
echo $aa->n1;
~~~
#### 1.查看
~~~
<?
echo "<meta charset='utf-8'>";
class Child{
public $name;
protected $age;
private $salary;
function __construct($name,$age,$salary){
$this->name=$name;
$this->age=$age;
$this->salary=$salary;
}
//通过公开函数调用私有内容
function shows($username){
if($username=="111"){
echo $this->name."||".$this->age."||".$this->salary;
}else{
echo "无权限查看";
}
}
//通过公开函数修改私有属性
public function setage($age){
if($age>100){
echo "你的年龄范围不对";
}else{
$this->age=$age;
}
}
}
$cc=new Child("田伟","18","888");
$cc->name="dsfsd";
echo $cc->name;
echo $cc->setage(66);
echo $cc->shows("111");
~~~
#### 2.修改
$cc->name="田伟";
写修改方法
## 继承
继承保证代码的复用性
![](https://box.kancloud.cn/85500de8f8037a67ef3f8f15898d8f56_520x335.png)
~~~
class stu{
public $name;
public $age;
public function showinfo(){
echo $this->name;
}
}
class pupil extends stu{
public function testing(){
echo "小学生考试";
}
}
class graduate extends stu{
public function testing(){
echo "大学生考试";
}
}
~~~
注意点:
1. 子类只能继承父类的public,protected ,不能继承private
2. 一个子类只能继承一个父类,但可以通过继承2次达到效果。
3. 子类默认不会自动继承父类的构造方法。
4.如果要调用发父类的构造方法或其他方法,可以通过
父类名::__construct();
parent::_construct();
![](https://box.kancloud.cn/1524c665098a3f605398766212231418_428x469.png)
## 多态,重载 overload
一样的函数名,但是参数个数不一样,达到调用同一个函数名,但是可以区分不同的函数。
重载函数:__call(),官方并不推荐。
总结:
1.php5 默认情况下不直接支持方法重载
2.可以通过 __call()模拟方法重载效果
3.PHP5魔术常量
__LINE__
__FILE__
__FUNCTION__ 必须在函数里面
__CLASS__ 必须在类里面调用
__METHOD__
__DIR__
__NAMESPACE__
## 方法重写、覆盖 override
父类知道每个子类都有某个方法,但父类不能确定子类方法的具体如何写,这个时候子类就可以重写覆盖这个方法。
注意:
**子类和父类的名称,参数必须完全一样**,参数名称可以不一样
覆盖的时候,子类的修饰符访问范围不能低于父类的修饰符访问权限。
子类覆盖是在子类的区域内覆盖,并不是修改了父类的程序。此时还是可以调用这个父类的方法
~~~
class A{
public $name;
function cry(){
echo "不知道怎么叫。。。";
}
}
class Dog extends A{
//覆盖
function cry(){
echo "小狗旺旺叫。。";
parent::cry();
}
}
$dog1=new Dog();
$dog1->cry();
~~~