摘要:在中最常用的幾種回調寫法如下匿名函數做為回調匿名函數,也叫閉包函數,允許臨時創建一個沒有指定名稱的函數。最經常用作回調函數參數的值。匿名函數的回調經常將其賦給一個變量或一個對象的屬性最終結果會輸出。
在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 WorkermanWorker; 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 WorkermanWorker; 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 WorkermanWorker; 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 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的靜態方法onMsg方法作為回調賦值給$worker->onMessage,因為是靜態方法,在onMsg內不能用$this哈。
我的知識分享 https://nai8.me
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/28550.html
摘要:話說當下一共有種運行模式,分別是和模塊模式。使用,全稱進程管理器進行管理。工作原理啟動時載入進程管理器進程管理器自身初始化,啟動多個解釋器進程并等待來自的連接當客戶端請求到達時,進程管理器選擇并連接到一個解釋器。 我們知道 workerman 程序需要在php-cli模式下運行,也就是命令行模式,這塊我們有必要了解一下。 話說PHP當下一共有4種運行模式,分別是CGI、FastCGI、...
摘要:一號坑整合加載第三方有幾種方式,具體參考官方手冊我用的是第一種命名空間自動加載的方式,因為我下的版本是有命名空間的,所以一定要把目錄放對了,把文件夾放到下,并且把里面除文件外的所有文件改為結尾。 由于需要開發長連接應用,要用到了Workerman,我是Windows的服務器,所以要把Wokerman裝到windows,不得不說Windows做服務器那真是「好用」啊,一開始自己按照Wor...
摘要:后面每開啟一個子進程,會將子進程的存儲到中,用來后面主進程監控子進程,如果子進程意外終止,主進程可以重新佛。將當前子進程設置為會話組再次創建子進程,為了防止在的系統下重新打開控制終端。 wokerman 啟動分析 @(學習)[workerman, php] 前期想說的 也是最近才看的代碼,遇到不懂得地方就去google,所以這篇文章里面穿插了很多參考資料,可以直接點擊閱覽。 需要了解一...
摘要:如果你現在處于以下幾種狀態,本資料非常適合你準備換工作,不知道從哪開始準備技術遇到瓶頸,不知道該學什么準備學,但不知道領域有多深進階篇原理原理共享存活時間異常處理如何迭代對象如何數組化操作對象如何函數化對象是什么,說個使用場景是什么,如 如果你現在處于以下幾種狀態,本資料非常適合你: 準備換工作,不知道從哪開始準備 技術遇到瓶頸,不知道該學什么 準備學 PHP,但不知道領域有多深 ...
摘要:背景最近在一些項目需要用到實時推送給分組的用戶,前端需要傳輸給后端的信息比較少,通過多方考慮選擇了通過框架基于搭建微服務。擁有定時器異步客戶端異步異步異步異步消息隊列等眾多高性能組件。配合的定時器,也可以定時推送數據。 背景 最近在一些項目需要用到Websocket實時推送給分組的用戶,前端需要傳輸給后端的信息比較少,通過多方考慮選擇了通過GatewayWorker框架(基于Worke...
閱讀 821·2023-04-26 00:37
閱讀 706·2021-11-24 09:39
閱讀 2132·2021-11-23 09:51
閱讀 3768·2021-11-22 15:24
閱讀 733·2021-10-19 11:46
閱讀 1868·2019-08-30 13:53
閱讀 2409·2019-08-29 17:28
閱讀 1314·2019-08-29 14:11