封装性是面向对象编程中的三大特性之一,封装就是把对象中的成员属性和成员方法加上访问修饰符,使其尽可能隐藏对象的内部细节,以达到对成员的访问控制(切记不是拒绝访问)。
public private protected三者区别
PHP5支持如下3种访问修饰符:
public (公有的 默认):在类的内部、被继承的子类、外部都可以访问
private (私有的):仅在类的内部访问,不能在被继承的子类及外部访问
protected (受保护的):在类的内部、被继承的子类可以访问,不能在外部访问
示例
<?php class person{ private $name = 'lisi'; protected $sex = 'man'; public $age = 20; public function say(){ echo $this->name.'<br>'; echo $this->sex.'<br>'; echo $this->age.'<br>'; } } echo $p->name; //无法获取 echo $p->sex; //无法获取 echo $p->age; //可以获取 $p = new person(); $p->say(); //可以全部获取 class stu extends person{ public function student(){ echo $this->name.'<br>'; echo $this->sex.'<br>'; echo $this->age.'<br>'; } } $ming = new stu(); $ming->student(); //可以获取sex和age,无法获取name ?>
魔术方法
1. __get()魔术方法:在我们尝试访问一个不存在的、私有的或受保护的属性时会被自动调用。它可以接受一个参数,该参数表示访问属性的名字,并且将该属性的值返回。
该魔术方法通常用在创建一个“只读”(在类外部只能可读,但不能修改)的属性来扩展访问控制。如下面的栗子:
//魔术方法 __get class person{ private $name; protected $age; public function __construct($name = '',$age = 0){ $this->name = $name; $this->age = $age; } public function __get($msname){ if(isset($this->$msname)){ return $this->$msname; }else{ return NULL; } } } $p = new person('lisi',30); echo $p->name.'<br>'; //输出 lisi echo $p->age.'<br>'; //输出 30
2.__set()魔术方法:在我们尝试修改一个不可访问的属性(私有或受保护的)时会被自动调用。它接受两个参数,一个表示属性的名字,另一个表示属性的值。如下面的栗子:
//魔术方法 __set class person1{ private $name; protected $age; public function __construct($name = '',$age = 0){ $this->name = $name; $this->age = $age; } public function __set($name,$value){ $this->$name = $value; } public function say(){ echo '我叫'.$this->name.',今年'.$this->age.'岁<br>'; } } $p1 = new person1('lisi',30); $p1->name = 'zhangsan'; $p1->age = 20; $p1->say(); //输出 我叫zhangsan,今年20岁
3.__isset()魔术方法:当对一个不可访问的属性调用isset()或empty()函数时会被自动调用,它接受一个参数,表示属性的名字。如下面的栗子:
//魔术方法 __isset() class person2{ public $name; private $age; protected $sex; public function __construct($name='',$age=0,$sex='man'){ $this->name = $name; $this->age = $age; $this->sex = $sex; } public function __isset($content){ echo '外部无法访问此属性,需要调用__isset<br>'; return isset($this->$content); } } $p2 = new person2('lisi',20,'man'); echo isset($p2->name).'<br>'; //此属性是public 可以直接检测 echo isset($p2->age).'<br>'; //需要调用__isset检测 echo isset($p2->sex).'<br>'; //需要调用__isset检测
4.__unset()魔术方法:在类的外部使用unset()函数销毁一个不可访问的属性时会被自动调用,它接受一个参数,表示属性的名字。如下面的栗子:
//魔术方法 __unset() class person3{ public $name; private $age; protected $sex; public function __construct($name='',$age=0,$sex='man'){ $this->name = $name; $this->age = $age; $this->sex = $sex; } public function __unset($content){ unset($this->$content); } public function say(){ echo $this->name.$this->age.$this->sex.'<br>'; } } $p3 = new person3('lisi',25,'man'); $p3->say(); //输出结果 lisi25man unset($p3->age); //unset私有属性会自动调用__unset方法 $p3->say(); // 输出结果 lisiman