Init(); } /** * Ограничиваем объект только одним экземпляром * * @return Engine */ static public function getInstance() { if (isset(self::$oInstance) and (self::$oInstance instanceof self)) { return self::$oInstance; } else { self::$oInstance= new self(); return self::$oInstance; } } /** * Инициализация * */ protected function Init() { $this->LoadModules(); } /** * Производит инициализацию всех модулей * */ public function InitModules() { foreach ($this->aModules as $oModule) { $oModule->Init(); } } /** * Завершаем работу всех модулей * */ public function ShutdownModules() { foreach ($this->aModules as $sKey => $oModule) { $oModule->Shutdown(); } } /** * Выполняет загрузку модуля по его названию * * @param string $sModuleName * @param bool $bInit - инициализировать модуль или нет * @return unknown */ protected function LoadModule($sModuleName,$bInit=false) { $tm1=microtime(true); if (file_exists("./classes/modules/".strtolower($sModuleName)."/".$sModuleName.".class.php")) { require_once("./classes/modules/".strtolower($sModuleName)."/".$sModuleName.".class.php"); } elseif (file_exists("./classes/modules/sys_".strtolower($sModuleName)."/".$sModuleName.".class.php")) { require_once("./classes/modules/sys_".strtolower($sModuleName)."/".$sModuleName.".class.php"); } else { throw new Exception("Не найден класс модуля - ".$sModuleName); } $oModule=new $sModuleName($this); if ($bInit) { $oModule->Init(); } $this->aModules[$sModuleName]=$oModule; $tm2=microtime(true); $this->iTimeLoadModule+=$tm2-$tm1; dump("load $sModuleName - \t\t".($tm2-$tm1).""); return $oModule; } /** * Загружает все используемые модули и передает им в конструктор ядро * */ protected function LoadModules() { $this->aConfigModule=include("./config/config.module.php"); foreach ($this->aConfigModule['autoLoad'] as $sModuleName) { $this->LoadModule($sModuleName); } } /** * Вызывает метод нужного модуля * * @param string $sName * @param array $aArgs * @return unknown */ public function _CallModule($sName,$aArgs) { $sArgs=''; $aStrArgs=array(); foreach ($aArgs as $sKey => $arg) { $aStrArgs[]='$aArgs['.$sKey.']'; } $sArgs=join(',',$aStrArgs); $aName=explode("_",$sName); $sModuleName=$aName[0]; if (isset($this->aModules[$sModuleName])) { $oModule=$this->aModules[$sModuleName]; } else { $oModule=$this->LoadModule($sModuleName,true); } $sCmd='$result=$oModule->'.$aName[1].'('.$sArgs.');'; eval($sCmd); return $result; /* $sCmd='$bExists=isset($this->MOD_'.$sModuleName.');'; eval($sCmd); if ($bExists) { $sCmd='$bExists=method_exists($this->MOD_'.$sModuleName.',"'.$aName[1].'");'; eval($sCmd); if ($bExists) { $sCmd='$result=$this->MOD_'.$sModuleName.'->'.$aName[1].'('.$sArgs.');'; eval($sCmd); return $result; } throw new Exception('В модуле '.$sModuleName.' нет метода '.$aName[1].'()'); } else { throw new Exception("Не найден модуль: ".$sModuleName); } */ return false; } /** * Ставим хук на вызов неизвестного метода и считаем что хотели вызвать метод какого либо модуля * * @param string $sName * @param array $aArgs * @return unknown */ public function __call($sName,$aArgs) { return $this->_CallModule($sName,$aArgs); } /** * Блокируем копирование/клонирование объекта роутинга * */ protected function __clone() { } } /** * Автозагрузка кслассов * * @param unknown_type $sClassName */ function __autoload($sClassName) { /** * Если класс подходит под шблон класса сущности то згружаем его */ if (preg_match("/^(\w+)Entity\_(\w+)$/i",$sClassName,$aMatch)) { $tm1=microtime(true); $sFileClass='classes/modules/'.strtolower($aMatch[1]).'/entity/'.$aMatch[2].'.entity.class.php'; if (file_exists($sFileClass)) { require_once($sFileClass); $tm2=microtime(true); dump($sClassName." - \t\t".($tm2-$tm1)); } } } ?>