四、对象的封装特性
1)什么是封装?
就是将对象的成员隐藏起来,不让其直接在类的外部访问,要通过一定的方法对封装起来的成员进行访问控制;
面向对象的封装特性并不是不让成员被访问,而是要对其进行访问控制;
2)修饰词
var 公有的(过时)
可以在类的外部直接通过对象访问(赋值和输出);在类的内部可以通过$this来进行访问;
public 公有的
等同于var;既可以修饰成员属性,又可以修饰成员方法;public修饰的成员在类的外部可以使用对象来调用,在类的内部使用$this进行访问;成员方法如果没有修饰词,默认为public修饰;
protected 受保护的
protected修饰的成员在类的外部不允许直接通过类的对象访问;protected修饰的成员在类的内部可以通过$this关键字来进行访问;protected修饰的成员在子类当中可以使用;
private 私有的
private修饰的成员在类的外部不允许直接通过类的对象访问;private修饰的成员在类的内部可以通过$this关键字来进行访问;private修饰的成员在子类当中不能使用;
class Person{ //public声明的成员属性和成员方法可以在类的外部直接调用,在类的内部也可访问 //[成员属性] public $name; private $sex; private $age; //[成员方法] function set($key,$val){ if($key=="sex"){ if($val==="男" || $val==="女" || $val==="保密"){ $this->sex=$val; }else{ echo "性别只能为男、女或保密!"; } } if($key=="age"){ if(is_int($val) && 0<$val && $val<150){ $this->age=$val; }else{ echo "年龄只能为0~150的整数!"; } } //return $this; } function info(){ echo "姓名:".$this->name.",性别:".$this->sex.",年龄:".$this->age; } } $person=new Person; $person->name="autumn"; $person->set("sex","男"); $person->set("age",25); //$person->set("sex","男")->set("age",25); $person->info();
3)魔术方法
①__set
参数:两个(属性的名称、属性的值)
触发时机:当对受保护的成员属性、私有的成员属性、未定义的成员属性进行赋值时会自动调用,并且将成员属性的名称传递给第一个参数,将成员属性要赋的值传递给第二个参数;
作用:对受保护的、私有的、未定义的成员属性进行赋值控制
②__get
参数:一个(接收要取值的属性的名称)
触发时机:当对受保护的、私有的、未定义的成员属性进行取值操作的时候会自动调用,并且将成员属性的名称传递给该方法;
作用:对受保护的、私有的、未定义的成员属性进行取值控制
class Person{ //[成员属性] public $name; private $sex; private $age; //[成员方法] function __set($key,$val){ //判断要设置的成员属性是否存在 if(!property_exists(__CLASS__, $key)){ echo $key." is not exists"; return false; } if($key=="sex"){ if($val==="男" || $val==="女" || $val==="保密"){ $this->sex=$val; }else{ echo "性别只能为男、女或保密!"; } } if($key=="age"){ if(is_int($val) && 0<$val && $val<150){ $this->age=$val; }else{ echo "年龄只能为0~150的整数!"; } } } function __get($proName){ if(!property_exists(__CLASS__, $proName)){ return $proName." is not exists"; } if($proName=="sex"){ return $this->sex; } if($proName=="age"){ return $this->age; } } function info(){ echo "姓名:".$this->name.",性别:".$this->sex.",年龄:".$this->age; } } $person=new Person; //name是公有的,可以直接在类的外部访问 $person->name="autumn"; //sex和age是受保护的或是私有的,会调用__set方法进行赋值 $person->sex="男"; $person->age=25; //name是公有的,可以直接输出该属性的值 echo $person->name; //sex和age是受保护的或是私有的,不能直接在类的外部访问,会调用__get获取属性的值 echo $person->sex; echo $person->age; var_dump($person);
③__isset
参数:一个(属性的名称)
触发时机:当对受保护的、私有的、未定义的成员属性进行isset或empty函数进行判断的时候自动调用;
作用:对受保护的、私有的、未定义的成员属性进行isset或empty的判断控制
注意:要有返回值、返回值为true或false
④__unset
参数:一个(属性的名称)
触发时机:当对受保护的、私有的成员属性进行unset销毁的时候自动调用,并将属性的名称以参数的形式传递
作用:对受保护的、私有的成员属性进行unset控制
class Person{ //[成员属性] public $name="autumn"; protected $sex="男"; private $age=25; //[成员方法] function __isset($proName){ if($proName=="sex"){ return true; } if($proName=="age"){ return true; } } function __unset($proName){ if($proName=="sex"){ unset($this->sex); } if($proName=="age"){ unset($this->age); } } function info(){ echo "姓名:".$this->name.",性别:".$this->sex.",年龄:".$this->age; } } $person=new Person; var_dump(isset($person->name));//不会调用__isset() echo "<hr>"; var_dump(empty($person->name));//不会调用__isset() echo "<hr>"; var_dump(isset($person->sex));//自动调用__isset() echo "<hr>"; var_dump(empty($person->sex));//自动调用__isset() echo "<hr>"; var_dump(isset($person->age));//自动调用__isset() echo "<hr>"; var_dump(empty($person->age));//自动调用__isset() echo "<hr>"; unset($person->name);//不会调用__unset() unset($person->sex);//自动调用__unset() unset($person->age);//自动调用__unset() $person->info();
原文地址:https://www.cnblogs.com/zhouwanqiu/p/9588737.html