PHP提供了内置的拦截器(intercepter),它可以拦截发送到未定义的属性或者方法的消息。它也被称为重载。不过我们为了避免和java和c++中的重载歧义还是叫拦截器。

 

拦截器可以是类更加完善和安全。对于调用的未知的属性或者方法可以自定义的处理。不管是自己猜测处理或者返回自定义的信息。

   
   
   
   
  1. /** 
  2.  * PHP5中拦截器学习测试 
  3.  * __get( $property ) 访问未定义的属性时候被调用 
  4.  * __set( $property, $value) 给未定义的属性赋值时被调用 
  5.  * __isset( $property ) 给未定义的属性调用isset()时候被调用 
  6.  * __unset( $property ) 给未定义的属性调用unset()的时候被调用 
  7.  * __call( $method, $arg_array ) 调用未定义的方法时候被调用 
  8.  *  
  9.  */ 
  10. error_reporting(E_ALL); 
  11. class person { 
  12.      
  13.     public $name
  14.     public $age
  15.      
  16.     public function __get( $property ) { 
  17.         return null; 
  18.     } 
  19.      
  20.     public function __set( $property$value) { 
  21.         return null; 
  22.     } 
  23.      
  24.     public function __isset( $property ) { 
  25.         return false; 
  26.     } 
  27.      
  28.     public function __unset( $property ) { 
  29.         return true; 
  30.     } 
  31.      
  32.     public function __call( $method,$arg_array ) { 
  33.         return $arg_array
  34.     } 
  35.      
  36.     public function initialize($name,$age) { 
  37.         $this->name = $name
  38.         $this->age = $age
  39.         return true; 
  40.     } 
  41.      
  42. $person = new person(); 
  43. $person->sex; //返回null 因为类中没有定义这个属性 
  44. isset($person->age); //如果类中有这个属性 但是没有赋值 那么不会 不会走__isset 会直接返回false或者true 
  45. $person->sex = 'male';//如果对一个不存在的属性定义那么会调用__get 方法 
  46. $person->init('ZhangSan','20');// 这个会走__call 参数会当作数组 $arg_array传入 
  47. unset($person->sex);//这里会调用__unset 方法