php __call()與call_user_func_array()理解

1. mixed __call ( string name, array arguments )

The magic method __call() allows to capture invocation of non existing methods. That way __call() can be used to implement user defined method handling that depends on the name of the actual method being called. This is for instance useful for proxy implementations. The arguments that were passed in the function will be defined as an array in the $arguments parameter. The value returned from the __call() method will be returned to the caller of the method.

譯文: 這個魔術方法容許用戶調用類中不存在的方法,它用於實現那些 依賴於在被調用時的真正方法名的方法. 典型的例子是用來實現代理. 方法的參數$arguments是一個數組 ,__call()的返回值返回給方法調用者

白話文: 這個方法主要是用來實現動態方法調用, 若是再一個類定義了__call()這個方法, 當用戶調用這個類的一個不存在的方法時,他可使用調用的那個不存在的方法的方法名和參數作出用戶定義在__call()方法體內的相應操做,此時 __call()方法的參數就是被調用的那個不存在的方法的方法名和參數

例子

Php代碼   收藏代碼
  1. <?php  
  2.   
  3. class Person  
  4. {  
  5.     function talk( $sound )  
  6.     {  
  7.         echo $sound;  
  8.     }  
  9.                   
  10.     function __call( $method , $args )  
  11.     {  
  12.         echo 'you call method ' . $method . '<br>';  
  13.                       
  14.         echo 'and the arguments are <br>';  
  15.                       
  16.         var_dump( $args );  
  17.     }  
  18. }  
  19.   
  20. $person = new Person();  
  21.               
  22. $person->test( 1 , TRUE );  
  23.   
  24. ?>  


程序輸出

引用
you call method test
and the arguments are
array
  0 => int 1
  1 => boolean true




2. mixed call_user_func_array ( callback function, array param_arr )


Call a user defined function with the parameters in param_arr.

參數


function
The function to be called.

param_arr
The parameters to be passed to the function, as an indexed array.


返回值
Returns the function result, or FALSE on error.

此方法能夠經過傳入類名,類中得方法名和方法參數達到動態調用方法的效果

例子

Php代碼   收藏代碼
  1. <?php   
  2.     class Person  
  3.     {  
  4.         function talk( $sound )  
  5.         {  
  6.             echo $sound;  
  7.         }  
  8.                   
  9.         function __call( $method , $args )  
  10.         {  
  11.             echo 'you call method ' . $method . '<br>';  
  12.                       
  13.             echo 'and the arguments are <br>';  
  14.                       
  15.             var_dump( $args );  
  16.         }  
  17.     }  
  18.   
  19.         $person = new Person();  
  20.               
  21.     call_user_func_array( array$person , 'talk' ) , array'hello' ) );  
  22. ?>  


程序輸出

引用
hello



兩個方法共用,實現代理模型

       
Php代碼   收藏代碼
  1. class Person  
  2.     {  
  3.         function talk( $sound )  
  4.         {  
  5.             echo $sound;  
  6.         }  
  7.                   
  8.         function __call( $method , $args )  
  9.         {  
  10.             echo 'you call method ' . $method . '<br>';  
  11.                       
  12.             echo 'and the arguments are <br>';  
  13.                       
  14.             var_dump( $args );  
  15.         }  
  16.     }  
  17.               
  18.     class PersonProxy  
  19.     {  
  20.         private $person;  
  21.                   
  22.         function __construct()  
  23.         {  
  24.             $this->person = new Person();  
  25.         }  
  26.           
  27.         function __call( $method , $args )  
  28.         {  
  29.             call_user_func_array( array$this->person , $method ) , $args );  
  30.         }  
  31.     }  
  32.               
  33.     $person_proxy = new PersonProxy();  
  34.   
  35.         $person_proxy->talk( 'thank you' );    


程序輸出 php

thank you
相關文章
相關標籤/搜索