spl_autoload_register 理解

spl_autoload_register() 提供了一种更加灵活的方式来实现类的自动加载(同一个应用中,可以支持任意数量的加载器,比如第三方库中的)

spl_autoload_register(‘func_name');
spl_autoload_register(array(‘class_name','method_name'));

spl_autoload_register() 只能加载同级的文件  如果需要其他级的文件 如下

function my_autoload ($ClassName) {
    include(__DIR__ . "/classes/" . $pClassName . ".php");
}
spl_autoload_register("my_autoload");

以下是自己写的一个简单的的mvc实现 

// use Matrix\Autoloader;  

class AutoloadPsr4 {
    public $maps = [];
    public function __construct()
    {
        echo "1";
        spl_autoload_register([$this,'autoload']); // 只要调用没有的类 就会调用此函数  自动注册类
    }
    // 自己写的自动加载函数
    public function autoload($classname) {
        // 完整的类名由命名空间和文件名称组成
        // 得到命名空间  根据命名空间 得到文件路径名名称
        $pos = strrpos($classname,'\\');
        $namespace = substr($classname,0,$pos);
        $realclass = substr($classname,$pos+1);
        $this->mapload($namespace,$realclass);
    }
    public function mapload($namespace,$realclass) {
        if(array_key_exists($namespace,$this->maps)) {
            $namespace = $this->maps[$namespace];
        } else {
            echo "map中空间没有对应的路径";
        }
        echo "namespace=".$namespace;
        echo "<br>";
        echo  "realclass=".$realclass;
        echo "<br>";
        $path = rtrim(str_replace('\\',"/",$namespace),'/')."/";
        echo "path=".$path;
        echo "<br>";
        $filepath = $path.$realclass.".php";
        echo "filepath=".$filepath;
        echo "<br>";
        if (file_exists($filepath)) {
            include($filepath);
        }else{
            die("路径不对");
        }
    }
    public function addMaps($namespace,$path) {
        if (array_key_exists($namespace,$this->maps)) {
            die("此命名空间已经存在");
        }
        $this->maps[$namespace] = $path;
    }
}
// 命名空间和路径不一致   需要添加  命名空间和路径的映射
// $a = isset($_GET['a']) ? $_GET['a'] : "index";
// $m = isset($_GET['m']) ? $_GET['m'] : "index";
// $auto = new AutoloadPsr4();
// $auto -> addMaps("controller","app/controller");  // 添加空间 命名隐射
// $m = ucfirst(strtolower($m));
// $namespace = "controller\\".$m."Controller";
// $obj = new $namespace();
// call_user_func([$obj,$a])

// 路径和命名空间一致
$a = isset($_GET['a']) ? $_GET['a'] : "index";
$m = isset($_GET['m']) ? $_GET['m'] : "index";
$auto = new AutoloadPsr4();                       // 注册spl_autoload_register 只要注册了 以后调用类就会自动加载
$m = ucfirst(strtolower($m));
$namespace = "app\controller\\".$m."Controller";  //  这里的app\controller  是固定的是写死的
$obj = new $namespace();
call_user_func([$obj,$a])

// E:\phpstudy_pro\WWW\mvc\index.php
namespace app\controller;

class IndexController {
    public function index() {
        echo "这是is".__METHOD__;
    }
    public function demo() {
        echo "这是demo方法";
    }
}

// E:\phpstudy_pro\WWW\mvc\app\controller\IndexController.php

namespace  用来定义命名空间

new \app\controller\indexcontroller.php    用来调用

调用 的时候还要  包含这个文件

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值