ini_set->session->auto_start){ self::sess()->start(); } } // TODO:目前只支持简单匹配 public static function start(){ $targetUrl = self::$kernel->request()->url; $params = self::$kernel->request()->params; $matched = false; foreach(self::$kernel->routes as $url => $callback){ if($url == $targetUrl || $url == '*'){ // 返回true则继续下一个匹配 if(true == call_user_func_array($callback, $params)){ $matched = true; continue; }else{ return; } } } if(!$matched){ self::$kernel->response(false) ->status(404) ->write('404 找不到此页面') ->send(); } } public static function route($pattern, $callback){ self::$kernel->routes[$pattern] = $callback; } public static function map($name, $callback){ if(method_exists(__CLASS__, $name)) throw new ErrorException("不能覆盖内部方法: ${name}"); self::$kernel->funcs[$name] = $callback; } public static function register($name, $class, $params = [], $callback = null){ // if(!class_exists($class)) throw new ErrorException("无法注册不存在的类: ${class}"); if(method_exists(__CLASS__, $name)) throw new ErrorException("不能覆盖内部方法: ${name}"); self::$kernel->classes[$name] = [$class, $params, $callback]; } public static function unregister($name, $class, $params = [], $callback = null){ unset(self::$kernel->classes[$name]); } public static function setBaseUrl($baseUrl){ self::$kernel->baseUrl = $baseUrl; } public static function getBaseUrl(){ return self::$kernel->baseUrl; } public static function url($path, $params = []){ if(empty($params)){ return self::$kernel->baseUrl.$path; }else{ $p = '?'; foreach($params as $k => $v){ $p .= "$k=$v"; } return self::$kernel->baseUrl.$path.urlencode($p); } } public static function redirect($url){ self::$kernel->response() ->status(303) ->header('Location', $url) ->send(); } public static function error($msg){ self::log('ERROR', $msg); exit('发生了系统内部错误'); // 不要显示详细错误到页面上 } public static function debug($msg){ self::log('DEBUG', $msg); } public static function info($msg){ self::log('INFO', $msg); } private static function log($tag, $msg){ $caller = debug_backtrace()[1]; // 第1层的栈包含了调用者信息 $msg = sprintf("[%s][%s %s:%d] %s\n", $tag, date('y/m/d H:i:s'), basename($caller['file']), $caller['line'], $msg); error_log($msg, 3, ROOT."/var/error.log"); } public static function __callStatic($name, $params){ return self::$kernel->invoke(self::$kernel, $name, $params); } public function __call($name, $params){ return $this->invoke($this, $name, $params); } private function invoke($kernel, $name, $params){ if(isset($kernel->funcs[$name])){ return call_user_func_array($kernel->funcs[$name], $params); } if(isset($kernel->instances[$name]) && empty($params)){ return $kernel->instances[$name]; } if(isset($kernel->classes[$name])){ list($class, $initParams, $callback) = $kernel->classes[$name]; if(!empty($params)){ // 如果带有参数则说明是需要创建新的对象 // 并且把第一个参数丢弃进行实例化新对象 array_shift($params); $ref = new ReflectionClass($class); $obj = $ref->newInstanceArgs($params); return $obj; } $ref = new ReflectionClass($class); $obj = $ref->newInstanceArgs($initParams); $kernel->instances[$name] = $obj; return $obj; } throw new ErrorException("无法调用未梆定的函数或方法: App::${name}()"); } } class ObjectBaseArray{ protected $__vars; public function __construct($vars = [], $allToObject = false){ $this->setArray($vars, $allToObject); } public function setArray($vars, $allToObject = false){ if($allToObject){ $this->__vars = $this->allToObject($vars); }else{ $this->__vars = &$vars; } } public function getArray(){ return $this->__vars; } public function __set($k, $v){ $this->__vars[$k] = $v; } public function __get($k){ if(isset($this->__vars[$k])) return $this->__vars[$k]; return false; // 注意:访问不存在的变量时返回的默认值是false,如果想知道是不是存在该变量请使用isset() } public function __isset($k){ return isset($this->__vars[$k]); } public function __unset($k){ unset($this->__vars[$k]); } public function __call($name, $params){ throw new ErrorException("无法调用不存在的方法: $name()"); } // 将数组中所有子项类型为array的数据转为ObjectBaseArray private function allToObject($arr){ foreach($arr as $k => $v){ if(is_array($v)){ $arr[$k] = new self($v, true); }else{ $arr[$k] = $v; } } return $arr; } }