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魔術方法,在實際開發工作中,可以靈活使用這些魔術方法的特性,優雅地處理各種場景。