日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

回调函数与PHP实例

發布時間:2024/1/17 php 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 回调函数与PHP实例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 什么是回調

? ? ? ?軟件模塊之間總是存在著一定的接口,從調用方式上,可以把他們分為三類:同步調用、回調和異步調用。同步調用是一種阻塞式調用,調用方要等待對方執行完畢才返回,它是一種單向調用;回調是一種雙向調用模式,也就是說,被調用方在接口被調用時也會調用對方的接口;異步調用是一種類似消息或事件的機制,不過它的調用方向剛好相反,接口的服務在收到某種訊息或發生某種事件時,會主動通知客戶方(即調用客戶方的接口)。回調和異步調用的關系非常緊密,通常我們使用回調來實現異步消息的注冊,通過異步調用來實現消息的通知。同步調用是三者當中最簡單的,而回調又常常是異步調用的基礎,因此,下面我們著重討論回調機制在不同軟件架構中的實現。

? ? ? 對于不同類型的語言(如結構化語言和對象語言)、平臺(Win32、JDK)或構架(CORBA、DCOM、WebService),客戶和服務的交互除了同步方式以外,都需要具備一定的異步通知機制,讓服務方(或接口提供方)在某些情況下能夠主動通知客戶,而回調是實現異步的一個最簡捷的途徑。對于一般的結構化語言,可以通過回調函數來實現回調。回調函數也是一個函數或過程,不過它是一個由調用方自己實現,供被調用方使用的特殊函數。
在面向對象的語言中,回調則是通過接口或抽象類來實現的,我們把實現這種接口的類成為回調類,回調類的對象成為回調對象。對于象C++或Object Pascal這些兼容了過程特性的對象語言,不僅提供了回調對象、回調方法等特性,也能兼容過程語言的回調函數機制。Windows平臺的消息機制也可以看作是回調的一種應用,我們通過系統提供的接口注冊消息處理函數(即回調函數),從而實現接收、處理消息的目的。由于Windows平臺的API是用C語言來構建的,我們可以認為它也是回調函數的一個特例。對于分布式組件代理體系CORBA,異步處理有多種方式,如回調、事件服務、通知服務等。事件服務和通知服務是CORBA用來處理異步消息的標準服務,他們主要負責消息的處理、派發、維護等工作。對一些簡單的異步處理過程,我們可以通過回調機制來實現。

2 PHP的回調函數的實現方法

2.1 全局函數的回調

? ? ?這里的全局函數的意思,是直接使用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個參數是一個數組,表示參數列表,按照順序依次會傳遞給要調用的函數。

2.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個元素是類名,第二個元素是要調用的函數名

如果我用這種方法調用一個類的非靜態方法(也就是把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 );
最終運行的結果跟原來一樣


2.3 對象的方法的回調

? 我先用最原始的字符串形式的調用方法嘗試了一下,如下所示:
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函數,這個方法可以用字符串來創建一個匿名函數,好,有思路了,可以創建一個匿名的函數,在這個匿名函數中,調用我們的回調函數,并把參數傳進去。
我先手動創建一個匿名函數anonymous,在這個函數中,用前面試出來的方法調用回調函數,如下所示:
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' );
//匿名函數的構建
function anonymous()
{
??? global $myobj;
??? global $fnName;
? ? global $params;
? ? $myobj->$fnName( $params[0] , $params[1] );
}
anonymous();

成功了。效果如下:

轉載于:https://www.cnblogs.com/zw874827903/p/6921459.html

總結

以上是生活随笔為你收集整理的回调函数与PHP实例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。