PHP內建攔截器初步介紹

技術小胖子發表於2017-11-08

PHP提供了內建的攔截器(intercepter),它可以攔截髮送到未定義的屬性或者方法的訊息。它也被稱為過載。不過我們為了避免和java和c++中的過載歧義還是叫攔截器。

 

攔截器可以是類更加完善和安全。對於呼叫的未知的屬性或者方法可以自定義的處理。不管是自己猜測處理或者返回自定義的資訊。


  1. <?php  
  2. /** 
  3.  * PHP5中攔截器學習測試 
  4.  * __get( $property ) 訪問未定義的屬性時候被呼叫 
  5.  * __set( $property, $value) 給未定義的屬性賦值時被呼叫 
  6.  * __isset( $property ) 給未定義的屬性呼叫isset()時候被呼叫 
  7.  * __unset( $property ) 給未定義的屬性呼叫unset()的時候被呼叫 
  8.  * __call( $method, $arg_array ) 呼叫未定義的方法時候被呼叫 
  9.  *  
  10.  */ 
  11. error_reporting(E_ALL); 
  12. class person { 
  13.      
  14.     public $name
  15.     public $age
  16.      
  17.     public function __get( $property ) { 
  18.         return null; 
  19.     } 
  20.      
  21.     public function __set( $property$value) { 
  22.         return null; 
  23.     } 
  24.      
  25.     public function __isset( $property ) { 
  26.         return false; 
  27.     } 
  28.      
  29.     public function __unset( $property ) { 
  30.         return true; 
  31.     } 
  32.      
  33.     public function __call( $method,$arg_array ) { 
  34.         return $arg_array
  35.     } 
  36.      
  37.     public function initialize($name,$age) { 
  38.         $this->name = $name
  39.         $this->age = $age
  40.         return true; 
  41.     } 
  42.      
  43. $person = new person(); 
  44. $person->sex; //返回null 因為類中沒有定義這個屬性 
  45. isset($person->age); //如果類中有這個屬性 但是沒有賦值 那麼不會 不會走__isset 會直接返回false或者true 
  46. $person->sex = `male`;//如果對一個不存在的屬性定義那麼會呼叫__get 方法 
  47. $person->init(`ZhangSan`,`20`);// 這個會走__call 引數會當作陣列 $arg_array傳入 
  48. unset($person->sex);//這裡會呼叫__unset 方法 

 

    本文轉自kefirking 51CTO部落格,原文連結:http://blog.51cto.com/phpzf/804700,如需轉載請自行聯絡原作者


相關文章