下面由workerman使用教程欄目給大家介紹幾種php回調(diào)寫(xiě)法,希望對(duì)需要的朋友有所幫助!
在workerman使用教程中會(huì)經(jīng)常使用,我們先寫(xiě)一個(gè)回調(diào)函數(shù),當(dāng)某個(gè)行為被觸發(fā)后使用該函數(shù)處理相關(guān)邏輯。
在PHP中最常用的幾種回調(diào)寫(xiě)法如下
匿名函數(shù)做為回調(diào)
匿名函數(shù)(Anonymous functions),也叫閉包函數(shù)(closures),允許臨時(shí)創(chuàng)建一個(gè)沒(méi)有指定名稱(chēng)的函數(shù)。最經(jīng)常用作回調(diào)函數(shù)(callback)參數(shù)的值。當(dāng)然,也有其它應(yīng)用的情況。
立即學(xué)習(xí)“PHP免費(fèi)學(xué)習(xí)筆記(深入)”;
匿名函數(shù)的回調(diào)經(jīng)常將其賦給一個(gè)變量(或一個(gè)對(duì)象的屬性)
$add?=?function($number1,$number2){ ????return?$number1+$number2; }; echo?$add(1,10);
最終結(jié)果會(huì)輸出11。
這中間有一個(gè)use的用法,現(xiàn)在很多框架都在使用,包括我自己發(fā)布的 yii2-wx 在處理微信付款結(jié)果通知的時(shí)候也有用到。
簡(jiǎn)單點(diǎn)說(shuō)就是當(dāng)我們?cè)O(shè)置了匿名函數(shù)的時(shí)候,可以從父作用域繼承變量,比如如下代碼
$number?=?10; $add?=?function($number1,$number2)?use?($number){ ????return?$number1+$number2?+?$number; }; echo?$add(1,10);
則結(jié)果是21,沒(méi)錯(cuò),匿名函數(shù)體可以使用繼承過(guò)來(lái)的變量 $number。
一點(diǎn)要注意的是,這種繼承是在函數(shù)被定義的時(shí)候就確定了,比如如下代碼
$number?=?10; $add?=?function($number1,$number2)?use?($number){ ????return?$number1+$number2?+?$number; }; $number?=?11; echo?$add(1,10);
結(jié)果還是21,后面重新的賦值并沒(méi)有起到作用。
那我們?nèi)绾谓鉀Q這個(gè)問(wèn)題那?
@nai8@
只需要將繼承的變量設(shè)置為引用即可,如下
$number?=?10; $add?=?function($number1,$number2)?use?(&$number){ ????return?$number1+$number2?+?$number; }; $number?=?11; echo?$add(1,10);
搞定了,22出現(xiàn)了。1 + 10 + 11;
在workerman中一般匿名函數(shù)作為回調(diào)用法如下
use?WorkermanWorker; require_once?__DIR__?.?'/Workerman/Autoloader.php'; $http_worker?=?new?Worker("http://0.0.0.0:2345"); //?匿名函數(shù)回調(diào) $http_worker->onMessage?=?function($connection,?$data) { ????//?向?yàn)g覽器發(fā)送hello?world ????$connection->send('hello?world'); }; Worker::runAll();
普通函數(shù)作為回調(diào)
這種用法并沒(méi)有什么可以多說(shuō)的,不像匿名函數(shù)那么多細(xì)節(jié),直接看代碼。
function?add($number1,$number2){ ????return?$number1+$number2; }; $add?=?"add"; echo?$add(1,10);
在這里沒(méi)有use用法,并且函數(shù)定義和賦值給變量順序誰(shuí)上誰(shuí)下都可以,在語(yǔ)法上這只是對(duì)add的一次變量賦值,之所以能作為回調(diào)是我們使用了add() 導(dǎo)致的,在workerman中一般用法如下
use?WorkermanWorker; require_once?__DIR__?.?'/Workerman/Autoloader.php'; $http_worker?=?new?Worker("http://0.0.0.0:2345"); //?匿名函數(shù)回調(diào) $http_worker->onMessage?=?'on_message'; //?普通函數(shù) function?on_mesage($connection,?$data) { ????//?向?yàn)g覽器發(fā)送hello?world ????$connection->send('hello?world'); } Worker::runAll();
類(lèi)方法作為回調(diào)
學(xué)習(xí)了前面的知識(shí),類(lèi)的方法作為回調(diào)就好學(xué)了,一句話(huà):將一個(gè)類(lèi)的公共方法作為回調(diào)函數(shù);
直接上在workerman中的用法
use?WorkermanWorker; require_once?__DIR__?.?'/Workerman/Autoloader.php'; //?載入MyClass require_once?__DIR__.'/MyClass.php'; $worker?=?new?Worker("websocket://0.0.0.0:2346"); //?創(chuàng)建一個(gè)對(duì)象 $myObject?=?new?MyClass(); $worker->onMessage???=?[$myObject,?'onMsg']; Worker::runAll();
我們將MyClass的onMsg方法作為回調(diào)賦值給$worker->onMessage。
類(lèi)靜態(tài)方法做為回調(diào)
這個(gè)最簡(jiǎn)單了,看代碼。
use?WorkermanWorker; require_once?__DIR__?.?'/Workerman/Autoloader.php'; //?載入MyClass require_once?__DIR__.'/MyClass.php'; $worker?=?new?Worker("websocket://0.0.0.0:2346"); $worker->onMessage???=?[$myObject,?'onMsg']; Worker::runAll();
我們將MyClass的靜態(tài)方法onMsg方法作為回調(diào)賦值給worker->onMessage,因?yàn)槭庆o態(tài)方法,在onMsg內(nèi)不能用this哈。