//fast核心框架
class Fastphp{
protected $_config=[];
public function __construct($config){
$this->_config=$config;
}
//运行程序
public function run(){
spl_autoload_register(array($this,'loadClass'));
$this->setDbConfig();
$this->setReporting();
$this->removeMagicQuotes();
$this->unregisterGlobals();
$this->route();
}
//路由处理
public function route(){
$controllerName=$this->_config['defaultController'];
$actionName=$this->_config['defaultAction'];
$param=array();
$url=$_SERVER['REQUEST_URI'];
/*$_SERVER $_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。$_SERVER["REQUEST_URI"] 当前脚本路径,根目录之后的目录。$_SERVER["SCRIPT_NAME"] 当前脚本的路径。这在页面需要指向自己时非常有用。
$_SERVER["PHP_SELF"] 当前正在执行脚本的文件名。$_SERVER["SCRIPT_FILENAME"] 当前执行脚本的绝对路径。
*/
//清除?之后的内容
$position=strpos($url,'?');//strpos() f函数查找字符串在另一字符串中第一次出现的位置(区分大小写),如果没有找到字符串则返回 FALSE。
$url=$position===false?$url:substr($url,0,$position);
//删除前后的/斜杠
$url=trim($url,'/');
if($url){
//使用/斜杠分割字符串,并保存在数组中
$urlArray=explode('/',$url);
//删除空的数组元素
$urlArray=array_filter($urlArray);//array_filter — 用回调函数过滤数组中的单元如果没有提供 callback 函数, 将删除 array 中所有等值为 FALSE 的条目。
//获取控制器名
$controllerName=ucfirst($urlArray[0]);//ucfirst() 函数把字符串中的首字符转换为大写。
//获取动作名
array_shift($urlArray);//array_shift() 函数用于删除数组中的第一个元素,并返回被删除的元素,如果数组为空则返回 NULL。
$actionName=$urlArray?$urlArray[0]:$actionName;
//获取URL参数
array_shift($urlArray);
$param=$urlArray?$urlArray:array();
//判断控制器和方法是否存在
$controller=$controllerName.'Controller';
if(!class_exists($controller)){//class_exists — 检查类是否已定义,名字的匹配是不分区大小写的。
exit($controller.'控制器不存在');
}
if(!method_exists($controller,$actionName)){//method_exists,检查类的方法是否存在于指定的 object中。
exit($actionName.'方法不存在');
}
/*如果控制器和操作方法存在,则实例化控制器,因为控制器对象里面还会用到控制器名和方法名,所以实例化的时候把他们俩的名称也传进去,结合Controller基类一起
*/
$dispatch=new $controller($controllerName,$actionName);
/* $dispatch保存控制器实例化后的对象,我们就可以调用它的方法,也可以像方法中传入参数,以下等同于:$dispatch->$actionName($param); */
call_user_func_array(array($dispatch,$actionName),$param);//call_user_func_array — 调用回调函数,并把一个数组参数作为回调函数的参数
}
}
//检测开发环境
public function setReporting(){
if(APP_DEBUG===true){
error_reporting(E_ALL);//error_reporting — 设置报告何种 PHP 错误,E_ALL报告所有 PHP 错误,ini_set('error_reporting', E_ALL);和 error_reporting(E_ALL); 一样
ini_set('display_errors','On');
}else{
error_reporting(E_ALL);
ini_set('display_errors','Off');//设置配置文件,关闭错误显示
ini_set('log_errors','On');//错误日志开启
//ini_set('error_log', RUNTIME_PATH. 'logs/error.log');
}
}
//删除敏感字符
public function stripSlashesDeep($value){
$value=is_array($value)?array_map(array($this,'stripSlashesDeep'),$value):stripslashes($value);//array_map — 为数组的每个元素应用回调函数,stripslashes 去掉反斜杠,addslashes() 加反斜杆,为了防止双层转义请使用get_magic_quotes_gpc() 进行检测
return $value;
}
//检测敏感字符并删除
public function removeMagicQuotes(){
if(get_magic_quotes_gpc()){
$_GET=isset($_GET)?$this->stripSlashesDeep($_GET):'';// isset 检测变量是否已设置并且非 NULL
$_POST=isset($_POST)?$this->stripSlashesDeep($_POST):'';
$_COOKIE=isset($_COOKIE)?$this->stripSlashesDeep($_COOKIE):'';
$_SESSION=isset($_SESSION)?$this->stripSlashesDeep($_SESSION):'';
}
}
/* 检测自定义全局变量并移除。因为register_globals已经弃用,如果已经弃用的register_globals指令被设置为On,那么局部变量也将在脚本的全局作用域中可用。例如,$_POST['foo']也将以$foo的形式存在,这样写是不好地地道道的实现,会影响代码中其他变量。相关信息,参考http://php.net/manual/zh/faq.using.php#faq.register-globals */
public function unregisterGlobals(){
if(ini_get('register_globals')){
$array=array('_SESSION','_POST','_GET','_COOKIE','_REQUEST','_SERVER','_ENV','_FILES');
foreach($array as $value){
foreach($GLOBALS[$value] as $key=>$var){
if($var === $GLOBALS[$key]){
unset($GLOBALS[$key]);
}
}
}
}
}
//配置数据库信息
public function setDbConfig(){
if($this->_config['db']){
Model::$dbConfig=$this->_config['db'];
}
}
//自动加载控制器和模型类
public static function loadClass($class){
$frameworks=__DIR__.'/'.$class.'.php';
$controllers=APP_PATH.'application/controllers/'.$class.'.php';
$models=APP_PATH.'application/models/'.$class.'.php';
$modelsclass=APP_PATH.'application/models/'.$class.'.class.php';
$controllersclass=APP_PATH.'application/controllers/'.$class.'.class.php';
$views=APP_PATH.'application/views/'.$class.'.class.php';
//echo $models.'
';
if(file_exists($frameworks)){//file_exists — 检查文件或目录是否存在
//加载框架核心类
include($frameworks);
}elseif(file_exists($controllers)){
//加载应用控制器类
include($controllers);
}elseif(file_exists($models)){
//加载应用模型类
include($models);
}elseif(file_exists($modelsclass)){
//加载应用模型基类
include($modelsclass);
}elseif(file_exists($controllersclass)){
//加载应用控制器基类
include($controllersclass);
}elseif(file_exists($views)){
//加载视图基类
include($views);
}else{
echo '错误处理代码!';
}
}
}
?>