php基于namespace的类自动加载

本文介绍了如何在PHP中使用命名空间进行类自动加载,对比了传统的URL字符串分割加载方式,强调了命名空间在Model、Service和Controller中的应用,并提到了在PhpStorm中的配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值