以下由workerman使用教學專欄來介紹幾種php回呼寫法,希望對需要的朋友有幫助!
在workerman中會經常使用,我們先寫一個回呼函數,當某個行為觸發後使用該函數處理相關邏輯。
在PHP中最常用的幾種回調寫法如下
匿名函數做為回呼
匿名函數(Anonymous functions),也叫閉包函數(closures),允許暫時建立一個沒有指定名稱的函數。最常用作回呼函數(callback)參數的值。當然,也有其它所應用的情況。
匿名函數的回呼經常將其賦給一個變數(或一個物件的屬性)
$add = function($number1,$number2){ return $number1+$number2; }; echo $add(1,10);
最終結果會輸出11。
這中間有一個use的用法,現在很多框架都在使用,包括我自己發布的 yii2-wx 在處理微信付款結果通知的時候也有用到。
簡單點說就是當我們設定了匿名函數的時候,可以從父作用域繼承變量,例如如下程式碼
$number = 10; $add = function($number1,$number2) use ($number){ return $number1+$number2 + $number; }; echo $add(1,10);
則結果是21,沒錯,匿名函數體可以使用繼承過來的變數$number。
一點要注意的是,這種繼承是在函數被定義的時候就確定了,例如如下程式碼
$number = 10; $add = function($number1,$number2) use ($number){ return $number1+$number2 + $number; }; $number = 11; echo $add(1,10);
結果還是21,後面重新的賦值並沒有起到作用。
那我們要如何解決這個問題那?
@nai8@
只需要將繼承的變數設為引用即可,如下
$number = 10; $add = function($number1,$number2) use (&$number){ return $number1+$number2 + $number; }; $number = 11; echo $add(1,10);
搞定了,22出現了。 1 10 11;
在workerman中一般匿名函數作為回調用法如下
use Workerman\Worker; require_once __DIR__ . '/Workerman/Autoloader.php'; $http_worker = new Worker("http://0.0.0.0:2345"); // 匿名函数回调 $http_worker->onMessage = function($connection, $data) { // 向浏览器发送hello world $connection->send('hello world'); }; Worker::runAll();
普通函數作為回調
這種用法並沒有什麼可以多說的,不像匿名函數那麼多細節,直接看程式碼。
function add($number1,$number2){ return $number1+$number2; }; $add = "add"; echo $add(1,10);
在這裡沒有use用法,並且函數定義和賦值給變數順序誰上誰下都可以,在語法上這只是對add的一次變數賦值,之所以能作為回調是我們使用了add () 導致的,在workerman中一般用法如下
use Workerman\Worker; require_once __DIR__ . '/Workerman/Autoloader.php'; $http_worker = new Worker("http://0.0.0.0:2345"); // 匿名函数回调 $http_worker->onMessage = 'on_message'; // 普通函数 function on_mesage($connection, $data) { // 向浏览器发送hello world $connection->send('hello world'); } Worker::runAll();
類別方法作為回調
學習了前面的知識,類別的方法作為回調就好學了,一句話:將一個類別的公共方法當作回呼函數;
直接上在workerman中的用法
use Workerman\Worker; require_once __DIR__ . '/Workerman/Autoloader.php'; // 载入MyClass require_once __DIR__.'/MyClass.php'; $worker = new Worker("websocket://0.0.0.0:2346"); // 创建一个对象 $myObject = new MyClass(); $worker->onMessage = [$myObject, 'onMsg']; Worker::runAll();
我們將MyClass的onMsg方法當作回呼賦值給$worker->onMessage。
類別靜態方法做為回呼
這個最簡單了,看程式碼。
use Workerman\Worker; 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的靜態方法onMsg方法當作回呼賦值給worker->onMessage,因為是靜態方法,在onMsg內不能用this哈。
以上是學習workerman之前需要知道的幾種php回呼寫法的詳細內容。更多資訊請關注PHP中文網其他相關文章!