Home > Article > Backend Development > 有关PHP回调函数的乌云。
本人较菜,请问各位侠士,如何在PHP中达到EventStack的NotifyWatcher方法可以将取得的数据返还给welcome.php指定的回调函数,我哪里写的不对啊 ???
出现的错误为:Fatal error: Function name must be a string in /home/latel/Workspace/new_zhebo/module/EventStack.php on line ××
/app/welcome.php
<?php if (!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) { //移除指定的观察者 }} ?>
还是那样,连错误信息都不给全!
$fGetSettings = function($oSettingDaemon) { //处理回调返回的系统设置数据模型 echo $oSettingDaemon;};$EventStack = new EventStack;//请求数据原型$EventStack->addEvent( "DATA_REQUEST", serialize(array( array( "request" => "settingDaemon" ) )), $fGetSettings, null);class EventStack { 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) {print_r(func_get_args());//传入正确 /*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() );print_r($this->_aEventStack);//赋值正确 $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) { //移除指定的观察者 }}
Array( [0] => DATA_REQUEST [1] => a:1:{i:0;a:1:{s:7:"request";s:13:"settingDaemon";}} [2] => Closure Object ( [parameter] => Array ( [$oSettingDaemon] => <required> ) ) [3] => )Array( [0] => Array ( [stamp] => DATA_REQUEST [value] => a:1:{i:0;a:1:{s:7:"request";s:13:"settingDaemon";}} [handler] => Closure Object ( [parameter] => Array ( [$oSettingDaemon] => <required> ) ) [scope] => [timestamp] => 1383634959 ))
还是那样,连错误信息都不给全!
$fGetSettings = function($oSettingDaemon) { //处理回调返回的系统设置数据模型 echo $oSettingDaemon;};$EventStack = new EventStack;//请求数据原型$EventStack->addEvent( "DATA_REQUEST", serialize(array( array( "request" => "settingDaemon" ) )), $fGetSettings, null);class EventStack { 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) {print_r(func_get_args());//传入正确 /*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() );print_r($this->_aEventStack);//赋值正确 $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) { //移除指定的观察者 }}
Array( [0] => DATA_REQUEST [1] => a:1:{i:0;a:1:{s:7:"request";s:13:"settingDaemon";}} [2] => Closure Object ( [parameter] => Array ( [$oSettingDaemon] => <required> ) ) [3] => )Array( [0] => Array ( [stamp] => DATA_REQUEST [value] => a:1:{i:0;a:1:{s:7:"request";s:13:"settingDaemon";}} [handler] => Closure Object ( [parameter] => Array ( [$oSettingDaemon] => <required> ) ) [scope] => [timestamp] => 1383634959 ))
<?php//边界判定if (!defined("__IS_ROOT")) die("Access Denied");if (!defined("__IS_APP_ENABLE")) die("Access Denied");global $EventStack, $Smarty;$oSettingDaemon = null;$oArchiveList_Case = null;//闭包函数(回调)$fGetSettings = function() use (&$oSettingDaemon) { //处理回调返回的系统设置数据模型 echo "wow";};$fDataMap = function() use (&$oArchiveList_Case) { //处理回调返回的数据模型中的数据地图 //模板赋值 echo "dota";};//请求数据原型$EventStack->addEvent(//添加数据请求至事件堆栈 "DATA_REQUEST", serialize(array( array( "request" => "settingDaemon" ) )), $fGetSettings, null);$EventStack->addEvent(//添加数据请求至事件堆栈 "DATA_REQUEST", serialize(array( array( "request" => "archiveList", "index" => "case", "sort" => "date DESC", "limit" => "0, 8" ), array( "request" => "archiveList", "index" => "case", "sort" => "successful_flag DESC", "limit" => "0, 8" ), array( "request" => "archiveList", "index" => "detection", "sort" => "hot_flag DESC", "limit" => "0, 5" ), array( "request" => "archiveList", "index" => "news", "sort" => "date DESC", "limit" => "0, 2" ), array( "request" => "archiveList", "index" => "news_industrial", "sort" => "hot_flag DESC", "limit" => "0, 1" ), array( "request" => "userList", "level" => "worker" ), array( "request" => "archiveList", "index" => "news", "sort" => "count_clicks DESC", "limit" => "0, 3" ) )), $fDataMap,//指定回调函数 null//指明上下文环境);//为模版绑定数据//输出页面$Smarty->display("kit-full.tpl");?>
<?php//事件堆栈处理组件/* * 堆栈程序应当只负责本职工作,即如实的记录和管理事件堆栈 * 堆栈程序对外界应当仅提供 添加观察者,移除观察者,添加事件,清空事件,获取堆栈列表或内容的接口 * 堆栈程序不应当负责对外的逻辑处理 * 通过两种方式主动向外界通讯 * 观察者:当有观察者(通常是个对象)指定的事件发生时,主动调用该组件的__invoke函数 * 回调函数,当添加事件时,事件的添加者可指定一个回调函数,当观察者对此事件做出处理之后,将会激活此回调函数 *///已知的事件戳记/* * NOTICE, 系统运行时的提示消息 * WARNING, 系统运行时的警告级消息 * ERROR, 系统运行时的错误级消息 * ISSUE_TRACK, 由错误处理和安全组件注册的戳记 * DATA_REQUEST, 由数据模型组件注册的戳记 */if (!defined("__IS_ROOT")) die("Access Denied");class EventStack extends Init{ private $_aWatcherRegistry = array();//已注册的观察者列表 private $_aEventStack = array();//事件堆栈 private $_aCallbackRegistry = array();//已注册的回调函数 function __construct() { $this->addEvent( "NOTICE", serialize(array("Module(Core) and Module(Pdo) is initiated")) ); $this->addEvent( "NOTICE", serialize(array("Module(EventStack) is initiated")) ); } function __destruct() { //将关键信息存储至数据源的Log表 //根据调试开关,决定是否输出调试信息至页面 $bDebugLock = parent::getArgument("lockring", "debug"); if ($bDebugLock) { $this->exportEventStack(); } } 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->toast($iKey); return $iKey; } public function addWatcher($oWatcher, $sWatchStamp) { //添加观察者 if(is_object($oWatcher)) { $this->_aWatcherRegistry[$sWatchStamp] = $oWatcher; $this->addEvent( "NOTICE", serialize(array("Watcher($sWatchStamp) is added on EventStack")) ); } } ##C## public function clearEventStack() { //清空事件堆栈 unset($this->_aEventStack); $this->addEvent( "NOTICE", serialize(array("EventStack is cleared")) ); } ##E## public function exportEventStack() { //输出调试信息 echo "debug"; echo "_________________________________________________><br/>"; foreach ($this->_aEventStack as $key => $value) { //if (in_array($value["stamp"], array("NOTICE", "WARNING", "ERROR", "ISSUE_TRACK"))) { echo "<b>Stackid:</b> $key <b>Stamp</b> ".$value["stamp"]." <b>Backtrace</b> ".$value["value"]." <b>TIMESTAMP</b> ".date("h:m:s",$value["timestamp"])."<br/>"; //} } } ##G## public function getStack($iStackId) { //根据是否提供堆栈序号,返回堆栈列表或指定堆栈的内容 if ($iStackId) { if(!isset($_aEventStack[$iStackId])) { $this->addEvent( "ISSUE_TRACK", serialize(array( "sLevel" => "notice", "sLocate" => "", "sMessage" => "Requested stack id($iStackId) doesn't existed in EventStack", "isLog" => true, "bDirectOutput" => false )) ); return null; } else { return $_aEventStack[$iStackId]; } } else { return $this->_aEventStack; } } ##L## public function loopEvent() { //遍历事件堆栈 //在所有其他组件运行完成时执行 #如果发现需要回调的或被观察者绑定的事件,则作出具体动作 foreach ($this->_aEventStack as $aEvent) { //推送相应事件至绑定此类型事件的观察者 if (array_key_exists($aEvent["stamp"], $this->_aWatcherRegistry)) { $mCallback = $this->_aWatcherRegistry[$aEvent["stamp"]] ( $aEvent["stamp"], $aEvent["value"] ); } //检查回调函数 $fFunc = $aEvent["fHandler"]; if (isset($mCallback) && is_callable($fFunc)) { $fFunc($mCallback); } else { } } } ##N## private function toast($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"] ); //如果指定了回调函数,依据观察者返回的数据,做出具体的操作 if (isset($this->_aEventStack[$iKey]["fHandler"]) && !$mCallback) { echo $func = $this->_aEventStack[$iKey]["fHandler"]; echo 1; $func($mCallback); } else { echo 2; $func(null); } } } ##R## public function removeWatcher($sWatchStamp) { //移除指定的观察者 unset($this->_aWatcherRegistry[$sWatchStamp]); if (empty($this->_aWatcherRegistry[$sWatchStamp])) { $this->addEvent( "NOTICE", serialize(array("Watcher($sWatchStamp) is removed")) ); return true; } else { return false; } }}?>
文件:Model.php
<?php//数据模型组件if (!defined("__IS_ROOT")) die("Access Denied");interface iModeldo{ function __toString();//将数据模型的数据转化为字符串返回以方便传递 function onModel($sModel, $aArgPack);//生成数据模型 function onModify($sModel, $aSqlPack);//修改数据模型}class SettingDaemon{ //[系统运行时设置]数据模型 #variables public $aSettingDaemon; #functions function __toString() { $aObjectArray = array( "asettingdaemon" => $this->aSettingDaemon ); print_r($aObjectArray); } function onModel($sModel, $aArgPack) { if ($sModel != "settingdaemon") return false; global $Core, $EventStack, $Pdo; try { $aDataBaseSoftLink = $Core->getArgument("db", "softLink"); $sTable = $aDataBaseSoftLink["system"]; $sSql = "SELECT * FROM $sTable"; $aResult = $Pdo->query($sSql); $sSettingDaemon = $aResult->fetchColumn(); $this->aSettingDaemon = unserialize($sSettingDaemon); //返回数据模型 return $this; } catch(PDOException $e) { $EventStack->addEvent( "ISSUE_TRACK", serialize(array( "sLevel" => "ERROR", "sLocate" => "Model->on->SettingDaemon", "sMessage" => "Requested Model(SettingDaemon) failed, possibly reason:".$e->getMessage(), "isLog" => true, "bDirectOutput" => false )) ); return false; } } function onModify($sModel, $aSqlPack) { if ($sModel != "settingdaemon") return false; global $EventStack, $Pdo; try { $aDataBaseSoftLink = $Core->getArgument("db", "softlink"); $sTable = $aDataBaseSoftLink["system"]; foreach ($aSqlPack as $sSql) { $Pdo->query($sSql); } } catch(PDOException $e) { $EventStack->addEvent( "ISSUE_TRACK", serialize(array( "sLevel" => "ERROR", "sLocate" => "Model->modify->SettingDaemon", "sMessage" => "", "isLog" => true, "bDirectOutput" => false )) ); } }}class StaticWords{ //[静态文本]数据模型 #variables public $sWelcomeIntro; public $sAboutZhebo; public $sAboutCulture; public $sAboutLaboratory; public $sAboutTeam; public $sAboutHornor; public $sFootIntro; #functions function __toString() { } function onModel($sModel, $aArgPack) { if ($sModel != "staticwords") return false; global $Core, $EventStack, $Pdo; try { $aDataBaseSoftLink = $Core->getArgument("db", "softLink"); $sTable = $aDataBaseSoftLink["system"]; $sSql = "SELECT * FROM $sTable"; $aResult = $Pdo->query($sSql); $aResultLine = $aResult->fetch(); $this->sWelcomeIntro = $aResultLine("introduction_short"); $this->sAboutZhebo = $aResultLine("introduction_all"); $this->sAboutCulture = $aResultLine("introduction_culture"); $this->sAboutLaboratory = $aResultLine("introduction_lab"); $this->sAboutTeam = $aResultLine("introduction_team"); $this->sAboutHornor = $aResultLine("introduction_hornor"); $this->sFootIntro = $aResultLine("introduction_foot"); //返回数据模型 return $this; } catch(PDOException $e) { $EventStack->addEvent( "ISSUE_TRACK", serialize(array( "sLevel" => "ERROR", "sLocate" => "Model->on->SettingDaemon", "sMessage" => "Requested Model(SettingDaemon) failed, possibly reason:".$e->getMessage(), "isLog" => true, "bDirectOutput" => false )) ); return false; } } function onModify($sModel, $aSqlPack) { if ($sModel != "staticwords") return false; global $EventStack, $Pdo; try { //取得所需表名 $aDataBaseSoftLink = $Core->getArgument("db", "softlink"); $sTable = $aDataBaseSoftLink["system"]; //验证参数 //生成Sql查询语句 //更新数据 //返回对象 return $this; } catch(PDOException $e) { $EventStack->addEvent( "ISSUE_TRACK", serialize(array( "sLevel" => "ERROR", "sLocate" => "Model->modify->SettingDaemon", "sMessage" => "", "isLog" => true, "bDirectOutput" => false )) ); } }}class ArchiveContent implements iModeldo{ //[文章内容]数据模型 #variables public $iId; public $sIndex; public $iAuthor; public $sAuthorName; public $sTimestamp; public $sTitle; public $sContent; public $bHotFlag; public $iCountClicks; #functions function __toString() { } function onModel($sModel, $aArgPack) { if ($sModel != "archivecontent") return false; global $Core, $EventStack; extract($aArgPack); try { //获得所需的数据表名 $aDataBaseSoftLink = $Core->getArgument("db", "softLink"); $sTable = $aDataBaseSoftLink["archive"]; //核实参数 $sSqlId = isset($iId)? " WHERE `id`=$iId": " WHERE `id`=1"; //生成查询Sql $sSql = "SELECT * FROM $sTable".$sSqlId; //取得数据 $aResult = $Pdo->query($sSql); while ($aRow = $aResult->fetch()) { $this->aArchiveList[] = array( "id" => $aRow["id"], "index" => $aRow["index"], "date" => $aRow["date"], "author" => $aRow["author"], "title" => $aRow["title"], "content" => $aRow["content"], "hot_flag" => $aRow["hot_flag"], "successful_flag" => $aRow["successful_flag"], "count_clicks" => $aRow["count_clicks"] ); } //返回数据模型 return $this; } catch(PDOException $e) { $EventStack->addEvent( "ERROR", serialize(array( "sLevel" => "ERROR", "sLocate" => "Model->on->ArchiveContent", "sMessage" => "Requested Model(ArchiveContent) failed, possibly reason:".$e->getMessage(), "isLog" => true, "bDirectOutput" => false )) ); } } function onModify($sModel, $aSqlPack) { if ($sModel != "archivecontent") return false; }}class Model extends Init{ #variables private $_aModelMap = array();//戳记和类名的实际对应 private $_aModels = array();//已注册的数据模型模块 #functions function __construct() { $this->registry(); //添加所有的数据模块至数据模块列表 $this->registerModel("SettingDaemon"); $this->registerModel("StaticWords"); $this->registerModel("ArchiveContent"); $this->registerModel("ArchiveList"); $this->registerModel("UserDetail"); $this->registerModel("UserList"); $this->registerModel("FriendLinkList"); $this->registerModel("ChattingLine"); $this->registerModel("SearchResult"); } function __invoke($sStamp, $sValue) { //收到事件堆栈推送的消息 if ($sStamp != "DATA_REQUEST") { //复查消息戳记 die("Module(Model) recived wrong toast from EventStack"); } else { $aValue = unserialize($sValue); //核查参数 if (!is_array($aValue)) { //数据请求者传递?本组件的参数不合法 } else { foreach ($aValue as $aArgPack) { //获得数据模型名 $sModelName = strtolower($aArgPack["request"]); //提取传递给数据模型的参数列表 array_shift($aArgPack); //生成需要的数据模型对象 $oModel = $this->creatModel($sModelName); //添加次数据模型对象至保存的列表 $this->_aModels[] = $oModel; //继续该数据模型填充数据,并保存至要返回的数据模型列表中 $oModel->onModel($sModelName, $aArgPack); } //将所有数据模型对象作为参数返回至事件堆栈, 事件堆栈会视回调函数返回至数据请求方,注意是一个数组 return $this->_aModels; } } } ##R## function registry() { //注册此组件为事件堆栈组件的观察者 global $EventStack; $EventStack->addWatcher($this, "DATA_REQUEST"); $EventStack->addWatcher($this, "DATA_MODIFY"); } private function registerModel($sModelName) { //注册戳记和类名的对应关系 $this->_aModelMap[strtolower($sModelName)] = $sModelName; } private function creatModel($sModelName) { //以工厂模式生成数据模型 if (in_array($sModelName, array_keys($this->_aModelMap))) { $sClassName = $this->_aModelMap[$sModelName]; return new $sClassName(); } else { return null; } }}?>
文件:App.php
<?php//应用程序组件/* * 和前端挂钩的组件 * 从Router组件获得基本的请求信息后 * 1.加载框架,获得框架的数据原型并绑定 * 2.加载具体的页面组件,该页面组件将自行请求数据源型并绑定 * 3.显示合成并处理后的页面 */if(!defined("__IS_ROOT")) die("Access Denied");class App extends Init{ #variables private $_sApp;//指定具体的应用组件 #functions function __construct() { define("__IS_APP_ENABLE", true); } function __invoke() { //通过使用$App()即可完成页面显示 global $Router; $aAppAvailableList = parent::getArgument("app"); $sApp = $Router->getController(); if (in_array($sApp, $aAppAvailableList)) { $this->_sApp = $sApp; $sFilePath = "module/app/".$sApp.".php"; if (is_file($sFilePath) && is_readable($sFilePath)) { require_once($sFilePath); } } }}?>
你给全错误信息不经行了吗?
Fatal error: Function name must be a string in C:\wamp\www\newzhebo\module\ EventStack.php on line 157
不就是 EventStack.php 的 157 行出错吗?
EventStack.php
143 private function toast($iKey) {144 //推送事件至相应的观察者145 if (array_key_exists($this->_aEventStack[$iKey]["stamp"], $this->_aWatcherRegistry)) {146 $mCallback = $this->_aWatcherRegistry[$this->_aEventStack[$iKey]["stamp"]](147 $this->_aEventStack[$iKey]["stamp"],148 $this->_aEventStack[$iKey]["value"]149 );150 //如果指定了回调函数,依据观察者返回的数据,做出具体的操作151 if (isset($this->_aEventStack[$iKey]["fHandler"]) && !$mCallback) {152 echo $func = $this->_aEventStack[$iKey]["fHandler"];153 echo 1;154 $func($mCallback);155 } else {156 echo 2;157 $func(null); //这个 $func 在哪里赋值的? } } }
你给全错误信息不经行了吗?
Fatal error: Function name must be a string in C:\wamp\www\newzhebo\module\ EventStack.php on line 157
不就是 EventStack.php 的 157 行出错吗?
EventStack.php
143 private function toast($iKey) {144 //推送事件至相应的观察者145 if (array_key_exists($this->_aEventStack[$iKey]["stamp"], $this->_aWatcherRegistry)) {146 $mCallback = $this->_aWatcherRegistry[$this->_aEventStack[$iKey]["stamp"]](147 $this->_aEventStack[$iKey]["stamp"],148 $this->_aEventStack[$iKey]["value"]149 );150 //如果指定了回调函数,依据观察者返回的数据,做出具体的操作151 if (isset($this->_aEventStack[$iKey]["fHandler"]) && !$mCallback) {152 echo $func = $this->_aEventStack[$iKey]["fHandler"];153 echo 1;154 $func($mCallback);155 } else {156 echo 2;157 $func(null); //这个 $func 在哪里赋值的? } } }
private function toast($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"] ); //如果指定了回调函数,依据观察者返回的数据,做出具体的操作 $func = $this->_aEventStack[$iKey]["fHandler"]; if (isset($this->_aEventStack[$iKey]["fHandler"]) && !$mCallback) { echo 1; $func($mCallback); } else { echo 2; $func(null); } } }
var_dump EventStack对象实例的结果如下
object(EventStack)[5]
private '_aWatcherRegistry' =>
array (size=3)
'ISSUE_TRACK' =>
object(Issue)[6]
private '_aLastIssue' =>
array (size=0)
...
'DATA_REQUEST' =>
object(Model)[8]
private '_aModelMap' =>
array (size=9)
...
private '_aModels' =>
array (size=8)
...
protected 'aInitArguments' =>
array (size=6)
...
protected 'aModules' =>
array (size=0)
...
private '_aModuleList' (Init) =>
array (size=11)
...
'DATA_MODIFY' =>
object(Model)[8]
private '_aModelMap' =>
array (size=9)
...
private '_aModels' =>
array (size=8)
...
protected 'aInitArguments' =>
array (size=6)
...
protected 'aModules' =>
array (size=0)
...
private '_aModuleList' (Init) =>
array (size=11)
...
private '_aEventStack' =>
array (size=17)
0 =>
array (size=5)
'stamp' => string 'NOTICE' (length=6)
'value' => string 'a:1:{i:0;s:41:"Module(Core) and Module(Pdo) is initiated";}' (length=59)
'handler' => null
'scope' => null
'timestamp' => int 1383656323
1 =>
array (size=5)
'stamp' => string 'NOTICE' (length=6)
'value' => string 'a:1:{i:0;s:31:"Module(EventStack) is initiated";}' (length=49)
'handler' => null
'scope' => null
'timestamp' => int 1383656323
2 =>
array (size=5)
'stamp' => string 'NOTICE' (length=6)
'value' => string 'a:1:{i:0;s:43:"Watcher(ISSUE_TRACK) is added on EventStack";}' (length=61)
'handler' => null
'scope' => null
'timestamp' => int 1383656323
3 =>
array (size=5)
'stamp' => string 'NOTICE' (length=6)
'value' => string 'a:1:{i:0;s:26:"Module(Issue) is initiated";}' (length=44)
'handler' => null
'scope' => null
'timestamp' => int 1383656323
4 =>
array (size=5)
'stamp' => string 'NOTICE' (length=6)
'value' => string 'a:1:{i:0;s:29:"Module(HashUtls) is initiated";}' (length=47)
'handler' => null
'scope' => null
'timestamp' => int 1383656323
5 =>
array (size=5)
'stamp' => string 'NOTICE' (length=6)
'value' => string 'a:1:{i:0;s:44:"Watcher(DATA_REQUEST) is added on EventStack";}' (length=62)
'handler' => null
'scope' => null
'timestamp' => int 1383656323
6 =>
array (size=5)