php命名空间namespace自动载入

php的命名空间仅仅提供了一个逻辑上的类的隔离空间,我们在引用类时,仍要自己实现自动载入。思路就是使用一个未引入的类时,php自动触发spl_autoload_register这个方法,然后就会根据命名空间的结构解析为文件路径,引入相关的类文件啦。

下面仅仅编写一个简单的自动载入方法。
(1).优先使用classMap载入基类。
建立classes.php基类映射文件。当php自动加载时优先遍历该文件引入相关类文件。

<?php

return [
    'foo\base\Application' => 'base/Application.php',
    'foo\base\Compiler' => 'base/Compiler.php',
    'foo\base\Container' => 'base/Container.php',
    'foo\base\Controller' => 'base/Controller.php',
    'foo\base\Event' => 'base/Event.php',
    'foo\base\Model' => 'base/Model.php',
    'foo\base\Object' => 'base/Object.php',
    'foo\base\Router' =>  'base/Router.php',
    'foo\base\Template' => 'base/Template.php',
];

(2)载入其他类。其他类在app命名空间下,包括controllers,models两个子命名空间。

<?php

$classMap = require(__DIR__ . '/classes.php');
$dirList = ['controllers', 'models'];//强制仅有子两个命名空间

spl_autoload_register(function ($class) use ($classMap, $dirList){
    if (!empty($classMap[$class])) {
        require($classMap[$class]);
    } else {
        list($alias, $dir, $class) = explode('\\', $class);
        if ($alias === 'app' && in_array($dir, $dirList)) {
            $controllerFile = '../' . $dir . '/'. $class . '.php';
            if (file_exists($controllerFile)) {
                require($controllerFile);
            } else {
                throw new \Exception('控制器不存在!');
            }
        } else {
            throw new \Exception('加载' . $class . '类文件失败!');
        }
    }
});

在某一类中使用using app\models\User;然后php就会自动载入models文件夹下的User类了。

要想使用第三方开发者的php类包,可以用composer自动载入。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值