首頁  >  文章  >  php框架  >  學習workerman之前需要知道的幾種php回呼寫法

學習workerman之前需要知道的幾種php回呼寫法

藏色散人
藏色散人轉載
2019-11-28 13:38:072217瀏覽

以下由workerman使用教學專欄來介紹幾種php回呼寫法,希望對需要的朋友有幫助!

學習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中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除