封装性是面向对象编程中的三大特性之一,封装就是把对象中的成员属性和成员方法加上访问修饰符,使其尽可能隐藏对象的内部细节,以达到对成员的访问控制(切记不是拒绝访问)。
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
