时间:2021-07-01 10:21:17 帮助过:7人阅读
- <!--?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);?>
输出调试信息 } ##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) { //移除指定的观察者 }} ?>
- <!--?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表 //根据调试开关,决定是否</pre-->输出调试信息至页面 } 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() { //
还是那样,连错误信息都不给全!
输出调试信息至页面 } 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) { //移除指定的观察者 }}
- $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表 //根据调试开关,决定是否
- 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 ))</required></required>
还是那样,连错误信息都不给全!
输出调试信息至页面 } 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) { //移除指定的观察者 }}
- $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表 //根据调试开关,决定是否
- 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 ))</required></required>
输出页面$Smarty->display("kit-full.tpl");?>
- <!--?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//指明上下文环境);//为模版绑定数据//
输出调试信息至页面 $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 "_________________________________________________>
- <!--?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表
- //根据调试开关,决定是否
文件: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)