屬性重載:當訪問一個不存在或者權限不夠的屬性的時候,能夠觸發一系列的魔術方法,就叫做屬性重載
__isset($name):當使用 isset()函數或者empty()函數 判斷屬性是否存在或者是否為空的時候會自動觸發
<?php //屬性重載 class Person{ //屬性 public $name; private $age; //構造方法 public function __construct($name,$age) { $this->name = $name; $this->age = $age; } } //實例化 $person = new Person('羅納爾多',35); //判斷 var_dump(isset($person->name)); //true var_dump(isset($person->age)); //false var_dump(empty($person->name)); //false var_dump(empty($person->age)); //true
很顯然,屬性 age 是存在的,但是因為是私有的,所以訪問不到,就判斷isset的結果為false了,不符合邏輯
<?php //屬性重載 class Person{ //屬性 public $name; private $age; //構造方法 public function __construct($name,$age) { $this->name = $name; $this->age = $age; } //isset魔術方法 //需要一個參數知道要判斷的屬性的名字 public function __isset($name){ //新建一個允許判斷的數據 //判斷當前元素是否在允許判斷的數組里 //如果允許,在內部判讀,返回判斷結果 //不允許,返回FALSE var_dump($name); return isset($this->$name);
//return empty($this->$name) //empty和isset外部所得到的結果 } } //實例化 $person = new Person('羅納爾多',35); //判斷 var_dump(isset($person->name)); //true 能訪問到,不經過__isset()魔術方法 var_dump(isset($person->age)); //true 訪問不到,經過__isset()魔術方法,判斷出age屬性是存在的,返回true var_dump(empty($person->name)); //false 能訪問到,不經過__isset()魔術方法 var_dump(empty($person->age)); //true 訪問不到,經過__isset()魔術方法,判斷出age屬性是存在的,返回true(與邏輯不符,所以需要在__isset()函數內部做判斷)
