全域回呼函數:
這裡的全域函數的意思,是直接用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個參數是一個數組,表示參數列表,依照順序依序會傳遞給要呼叫的函數。
效果如下:
類別的靜態方法的回呼:
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();
以上是php 回呼函數的實作方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!