PhpStorm中设置命名空间
Loader.php
<?php
namespace MVC;
class Loader{
public static function autoload($namespace){
$path = trim(str_replace(__NAMESPACE__,"",$namespace),DIRECTORY_SEPARATOR).".php";
if(is_file($path)){
//echo "Load File : ".$path;
require $path;
}else{
//echo "Not Found : ".$path;
}
}
}
spl_autoload_register(__NAMESPACE__ .'\Loader::autoload');
之前开发过的MVC的路由模块,采用的方式是将URL字符串进行分割,然后分析得到其中的文件夹部分和类名部分,再组合成path进行加载。其实更好的方式是采用命名空间进行加载,对于Model和Service等部分的class可以直接使用完整的命名空间进行调用,对于Controller的命名空间可以通过分析URL得到。
Router.php
<?php
namespace MVC;
require "Loader.php";
class Router{
public static function init(){
$path = isset($_SERVER['PATH_INFO'])? $_SERVER['PATH_INFO']:null;
$path = str_replace("index.php/",'',$path);
$path = trim($path,"/");
$prefix = "./Controller/";
$suffix = "Controller.php";
$defaultController = "Home";
$defaultFunction = "Index";
$path00 = str_replace("//","/",$prefix.$path."/".$defaultController.$suffix);
$path10 = $prefix.$path.$suffix;
if(is_file($path00)){
$function = $defaultFunction;
$space = str_replace(["./",".php"],"",$path00);
$namespace = __NAMESPACE__."\\".str_replace("/","\\",$space);
$obj = new $namespace();
$obj->$function();
}elseif (is_file($path10)){
$function = $defaultFunction;
$space = str_replace(["./",".php"],"",$path10);
$namespace = __NAMESPACE__."\\".str_replace("/","\\",$space);
$obj = new $namespace();
$obj->$function();
}elseif (strpos($path,"/")){
$arr = explode("/",$path);
$len = count($arr);
$function = $arr[$len-1];
unset($arr[$len-1]);
$path11 = $prefix.implode("/",$arr).$suffix;
if(is_file($path11)){
$space = str_replace(["./",".php"],"",$path11);
$namespace = __NAMESPACE__."\\".str_replace("/","\\",$space);
$obj = new $namespace();
$obj->$function();
}else{
http_response_code(404);
}
}else{
http_response_code(404);
}
}
}
Router::init();