ホームページ >バックエンド開発 >PHPチュートリアル >「ヘルプ」PHP コールバック関数に関する質問

「ヘルプ」PHP コールバック関数に関する質問

WBOY
WBOYオリジナル
2016-06-23 14:26:141041ブラウズ

この投稿は kericw によって最終編集されました: 2013-11-01 15:37:40

PHP コールバック コールバック PHP

私は初心者です、皆さんに質問したいのですが、どうすれば EventStack の NotifyWatcher メソッドを実現できますか? PHPが取得したデータを返すには、welcome.phpに指定したコールバック関数のどこを間違えたのでしょうか? ? ?

発生するエラーは次のとおりです: 致命的なエラー: 関数名は /home/latel/Workspace/new_zhebo/module/EventStack.php の ×× 行目の文字列である必要があります

/app/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);?>



/ EventStack.php

<?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 行目で再度配列から関数を取得しようとし、取得したデータをパラメータとして関数

はは、私は質問する技術が欠けているようです。 。

助けてください。そうしないと、プロジェクトはここで停止します。 。 。 。 。 。

頼れるのは自分だけのようです

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。