php基于namespace的类自动加载

来源:互联网 发布:淘宝直播镜像 编辑:程序博客网 时间:2024/06/17 07:46

PhpStorm中设置命名空间

这里写图片描述

Loader.php

<?phpnamespace 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

<?phpnamespace 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();
原创粉丝点击