PHP語言教程-魔術方法之屬性重載和方法重載
- 2019 年 11 月 26 日
- 筆記
PHP魔術方法是以 __ 兩個下劃線開頭的方法,具有魔術功能的一些方法,本文主要講實現屬性重載和方法重載的魔術方法。
屬性重載
__set()魔術方法 __get()魔術方法 示例代碼:
<?php class User { private $name; private $age; } // 實例化User類 $user = new User(); // 調用類的私有屬性 echo $user->name;
輸出:
PHP Fatal error: Uncaught Error: Cannot access private property User::$name in /Users/frankphper/www/php/magic/demo1.php:9
示例中我們調用了私有屬性,程序運行時報了一個致命錯誤,大致意思是說不能訪問私有屬性name 我們在以上示例代碼中的類定義代碼裏面增加以下代碼:
// 屬性重載 public function __set($name, $value) { echo "Setting $name to $value" . PHP_EOL; $this->$name = $value; } public function __get($name) { if (!isset($this->$name)) { echo '未設置' . PHP_EOL; // 設置默認值 $this->$name = 'guest' . PHP_EOL; } return $this->$name; }
輸出:
未設置 guest
代碼講解: 我們在代碼中增加了__set()和__get()兩個魔術方法,再次運行代碼,輸出正常,沒有報錯。 當我們試圖寫入一個不存在或不可見的屬性時,PHP就會執行對象(類)中的__set()魔術方法,方法必須接收兩個參數,用來存放屬性名和屬性值。當我們試圖讀取一個不存在或者不可見的屬性時,PHP就會執行對象(類)中的__get()魔術方法。
__set()和__get()作用:
1、直接在對象(類)的外部調用對象(類)的私有屬性是會報錯的,但是如果對象(類)中定義了__set()魔術方法,就可以很方便的調用對象(類)的私有屬性,因為魔術方法是自動調用的,不需要顯式地調用。 2、動態創建對象(類)的屬性,如果對象(類)中定義了__set()和__get()魔術方法,那麼當調用對象屬性取值時,即使這個屬性不存在,也不會報錯,從而提升了程序的健壯性。
方法重載
__call()魔術方法
__callStatic()魔術方法
示例代碼:
<?php class User { private $name; private $age; } // 實例化User類 $user = new User(); // 調用類中不存在的方法 $userInfo = $user->userInfo('lucy', 18);
輸出:
PHP Fatal error: Uncaught Error: Call to undefined method User::userInfo() in /Users/frankphper/www/php/magic/test.php:9
示例中我們調用了不存在的方法,程序報了一個致命錯誤,大致意思是不能訪問未定義的方法userInfo()我們在以上示例代碼中的類定義代碼裏面增加以下代碼:
// 方法重載 public function __call($methodName, $params) { echo '方法名:' . $methodName . PHP_EOL; print_r($params); } static function __callStatic($methodName, $params) { echo '方法名:' . $methodName . PHP_EOL; print_r($params); }
輸出:
方法名:userInfo Array ( [0] => lucy [1] => 18 )
代碼講解: 我們在代碼中增加了__call()魔術方法,再次運行程序,輸出正常,沒有報錯。當我們試圖調用對象(類)中一個不存在或者不可見的方法時,PHP會執行對象(類)中的_call()魔術方法。__call()也必須接收兩個參數,用來存放試圖調用的方法名和要傳遞給該方法的參數。如果我們試圖調用對象(類)中一個不存在或者不可見的靜態方法時,PHP會執行對象(類)中的__callStatic()魔術方法。
__call()和__callStatic()作用:
1、防止調用不存在或者不可見的方法而報錯 2、動態創建對象(類)的方法
總結
我們通過示例代碼講解了屬性重載和方法重載的PHP魔術方法,在實際開發工作中,可以靈活使用這些魔術方法的特性,優雅地處理各種場景。