先來了解一下PHP類中的__get和__set函數
當我們試圖獲取一個不可達屬性時(比如private),類會自動調用__get函數。
當試圖設置一個不可達屬性時(比如private),類會自動調用__set函數,我們一起來看個例子:
<?php class Person{ public $name = '周伯通'; private $sex = '男'; } $class = new Person(); echo $class->sex;
這里$sex聲明了私用變量,私有變量或方法在類實例化是不能直接訪問的,所以上面會拋出異常
Fatal error: Uncaught Error: Cannot access private property Person::$sex
我們再稍加改造一下:
<?php class Person{ public $name = '周伯通'; private $sex = '男'; function __get($name){ echo '個人信息:'.$name.$this->sex; } } $class = new Person(); echo $class->sex;//個人信息:sex男
可以看出sex方法自動調用了,並可以訪問私有變量。
我們再來看一下__set函數,同樣也是先使用可達的私有屬性:
<?php class Person{ public $name = '周伯通'; private $sex = '男'; function __set($name, $val){ echo '個人信息:'.$name. $val; } } $class = new Person(); $class->sex = '女'; echo $class->sex;
個人信息:sex女 ( ! ) Fatal error: Uncaught Error: Cannot access private property Person::$sex in G:\web\gitlearn\set.php on line 11 ( ! ) Error: Cannot access private property Person::$sex in G:\web\gitlearn\set.php on line 11
這里調用了__set函數並提示我們不能使用類的私有屬性。可以看到sex在外部是被改變 了,但是拋出了致命錯誤
現在我們來通過__set函數實現外部使用私有屬性:
<?php class Person{ public $name = '周伯通'; private $sex = '男'; function __set($name, $val){ //echo '個人信息:'.$this->$name = $val; $this->$name = $val; //注意 這里是$name,是要設置訪問的變量名,如果大家用$this->name,會看到本例會輸出的是 男 } function getSex(){ echo $this->sex; //獲取新的屬性 } } $class = new Person(); $class->sex = '女'; echo $class->getSex();// 輸出 女
通過上面幾個例子,相信大家對set/get應該有更深的理解啦。
