ホームページ >バックエンド開発 >PHPチュートリアル >「ヘルプ」PHP コールバック関数に関する質問
PHP コールバック コールバック PHP
私は初心者です、皆さんに質問したいのですが、どうすれば EventStack の NotifyWatcher メソッドを実現できますか? PHPが取得したデータを返すには、welcome.phpに指定したコールバック関数のどこを間違えたのでしょうか? ? ?<?phpif (!defined("__IS_ROOT")) die("Access Denied");global $EventStack;//闭包函数(回调)$fGetSettings = function($oSettingDaemon) { //处理回调返回的系统设置数据模型 echo $oSettingDaemon;};//请求数据原型$EventStack->addEvent( "DATA_REQUEST", serialize(array( array( "request" => "settingDaemon" ) )), $fGetSettings, null);?>
<?php//事件堆栈处理组件/*数 *///已知的事件戳记/* */if (!defined("__IS_ROOT")) die("Access Denied");class EventStack extends Init{ private $_aWatcherRegistry = array();//已注册的观察者列表 private $_aEventStack = array();//事件堆栈 private $_aCallbackRegistry = array();//已注册的回调函数 function __construct() { } function __destruct() { //将关键信息存储至数据源的Log表 //根据调试开关,决定是否输出调试信息至页面 } function __toString() { } ##A## public function addEvent($sStamp = "ISSUE_TRACK", $sValue, $fHandler = null, $mScope = null) { /*sStamp: 此条消息的戳记 *sValue: 序列化的数组 * fHandler(function): 匿名回调函数 * mScope(mixed type): 回调函数的上下文环境, * null表示传入的handler函数是一个全局函数, * 字符串类型表示传入的handler函数是scope类的静态函数, * 对象类型表示传入的scope是一个对象,handler函数是对象的一个方法 */ $this->_aEventStack[] = array( "stamp" => $sStamp, "value" => $sValue, "handler" => $fHandler, "scope" => $mScope, "timestamp" => time() ); $iKey = sizeof($this->_aEventStack) - 1; $this->notifyWatcher($iKey); return $iKey; } public function addWatcher($oWatcher, $sWatchStamp) { } ##C## public function clearEventStack() { //清空事件堆栈 } ##E## public function exportEventStack() { //输出调试信息 } ##G## public function getStack($iStackId) { //根据是否提供堆栈序号,返回堆栈列表或指定堆栈的内容 } ##N## private function notifyWatcher($iKey) { //推送事件至相应的观察者 if (array_key_exists($this->_aEventStack[$iKey]["stamp"], $this->_aWatcherRegistry)) { $mCallback = $this->_aWatcherRegistry[$this->_aEventStack[$iKey]["stamp"]]( $this->_aEventStack[$iKey]["stamp"], $this->_aEventStack[$iKey]["value"], $this->_aEventStack[$iKey]["handler"], $this->_aEventStack[$iKey]["scope"] ); //如果指定了回调函数,依据观察者返回的数据,做出具体的操作 if (isset($this->_aEventStack[$iKey]["fHandler"]) && !$mCallback) { $func = $this->_aEventStack[$iKey]["fHandler"]; $func($mCallback); } else { $func(null); } } } ##R## public function removeWatcher($sWatchStamp) { //移除指定的观察者 }}?>
1 回だけ見た $fGetSettings
1 回だけ見た $fGetSettings
モデレーター、あなたの答えを読んだのですが、よく理解できませんでした。
今すぐこれを実行したいと思います。
welcome.php ページは、EventStack->addEvent メソッドを通じてコールバック関数を EventStack に登録します。EventStack が対応するデータを取得すると、登録されたコールバック関数にデータが取り込まれて実行されます。
私の言語能力はあまり良くありません。
グローバル $fGetSettings のことですか?
関数名は文字列である必要があります
関数名は文字列である必要があります
エラーの場所が指定されていないため、推測できません。
$fGetSettings はクロージャなので、どこかで使用する必要がありますよね?
しかし、それはありません
指定したコード スニペット内の関数名は文字列である必要があります
関数名は文字列である必要があります
エラーの場所が指定されていないため、推測できません!
$fGetSettings はクロージャなので、どこかで使用する必要がありますよね?
しかし、それはあなたが与えたコードスニペットにはありません
エラー行は EventStack.php の 72 行目にあります
クロージャ関数は EventStack.php の 37 行目に渡されます
クロージャはパラメータとして使用され、保存されますオブジェクト ($ EventStack) のプライベート配列属性に $_aEventStack が含まれています
$EventStack がデータを取得した後、72 行目で再度配列から関数を取得しようとし、取得したデータをパラメータとして関数
はは、私は質問する技術が欠けているようです。 。
助けてください。そうしないと、プロジェクトはここで停止します。 。 。 。 。 。
頼れるのは自分だけのようです