全域回呼函數:
這裡的全域函數的意思,是直接使用function定義的函數,它不包含在任何對象或類之中。請看下面的例子。
範例程式碼:
function fnCallBack( $msg1 , $msg2 ){ echo 'msg1:'.$msg1; echo "<br />n"; echo 'msg2:'.$msg2;}$fnName = "fnCallBack";$params = array( 'hello' , 'world' );call_user_func_array( $fnName , $params );
代碼說明:
這裡使用了PHP內建的函數call_user_func_array來進行調用。call_user_func_array有兩個參數,第1個參數是一個字串,表示要調用的函數名,第2個參數是一個數組,表示參數列表,按照順序依次會傳遞給要調用的函數。
效果如下:
類的靜態方法的回調:
如果我們要回調的方法,是一個類的靜態方法,那怎麼辦呢?我們依然可以利用PHP內建的call_user_func_array方法來進行調用,請看樣本:
class MyClass{ public static function fnCallBack( $msg1 , $msg2 ) { echo 'msg1:'.$msg1; echo "<br />n"; echo 'msg2:'.$msg2; }} $className = 'MyClass';$fnName = "fnCallBack";$params = array( 'hello' , 'world' );call_user_func_array( array( $className , $fnName ) , $params );
代碼說明:
這段代碼和第1種方法的代碼很相似,我們將類名(MyClass)也作為call_user_func_array的第1個參數傳遞進去,就可以實作類別的靜態方法的回調了。注意,這時call_user_func_array的第1個參數是一個數組了,數組的第1個元素是類名,第二個元素是要調用的函數名
運行結果:
(其實和第1種方法的結果是一樣的 ^_^ )
繼續研究
如果我用這種方法調用一個類的非靜態方法(也就是把static去掉),會出現什麼結果呢?請看下面代碼
class MyClass{ public function fnCallBack( $msg1 , $msg2 ) { echo 'msg1:'.$msg1; echo "<br />n"; echo 'msg2:'.$msg2; }} $className = 'MyClass';$fnName = "fnCallBack";$params = array( 'hello' , 'world' );call_user_func_array( array( $className , $fnName ) , $params );
運行結果還是和一樣!
對象的方法的回調:
我先用最原始的字串形式的調用方法嘗試了一下,如下所示:
class MyClass{ private $name = 'abc'; public function fnCallBack( $msg1 = 'default msg1' , $msg2 = 'default msg2' ) { echo 'object name:'.$this->name; echo "<br />n"; echo 'msg1:'.$msg1; echo "<br />n"; echo 'msg2:'.$msg2; }} $myobj = new MyClass();$fnName = "fnCallBack";$params = array( 'hello' , 'world' );$myobj->$fnName();
成功了,輸出結果
調用是成功了,不過如何把參數params傳給這個方法呢,如果把params直接傳進去,那麼它會作為1個參數,怎麼把params拆開來傳進去呢?
查了下PHP手冊,找到了create_function函數,這個方法可以用字串來建立一個匿名函數,好,有思路了,可以建立一個匿名的函數,在這個匿名函數中,調用我們的回呼函數,並把參數傳進去。
class MyClass{ private $name = 'abc'; public function fnCallBack( $msg1 = 'default msg1' , $msg2 = 'default msg2' ) { echo 'object name:'.$this->name; echo "<br />n"; echo 'msg1:'.$msg1; echo "<br />n"; echo 'msg2:'.$msg2; }} $myobj = new MyClass();$fnName = "fnCallBack";$params = array( 'hello' , 'world' );$strParams = ''; $strCode = 'global $myobj;global $fnName;global $params;$myobj->$fnName(';for ( $i = 0 ; $i < count( $params ) ; $i ++ ){ $strParams .= ( '$params['.$i.']' ); if ( $i != count( $params )-1 ) { $strParams .= ','; }}$strCode = $strCode.$strParams.");";$anonymous = create_function( '' , $strCode);$anonymous();