• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

PHP使用命名空间(namespace),实现自动加载

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

示例:

#/DB/MySql.class.php也就是DB文件夹下有MySql.class.php文件

namespace DB;

class MySql
{

    public function __construct()
    {
        var_dump(__FILE__);
    }
}
#/index.php

namespace Home;

use DB\MySql;

$mysql = new MySql();

报错

Fatal error: Class 'DB\MySql' not found in D:\localhost\demo\space\index.php on line 23

修改

修改 index.php 改成如下,可以了,但是为什么不能自动加载?

namespace Home;

use DB\MySql;

spl_autoload_register(function ($class) {
    if ($class) {
        $file = str_replace('\\', '/', $class);
        $file .= '.class.php';
        if (file_exists($file)) {
            include $file;
        }
    }
});

$mysql = new MySql();

要点:

第一:

命名空间跟文件加载并无直接关系,只是有些语言,将命名空间结构和文件结构对应起来了。 以php为例,一般的命名空间结构,跟php文件结构是存在映射关系的,通过命名空间名称,就能算出该类的实际存储位置, 然后实例化的时候,会触发用设置的spl自动加载函数将文件引入。

Xee:命名空间是事先通过自动导入或者include,require之类导入的,然后会根据命名空间对应起来,实现自动载入)

第二:

namespace Home;
use DB\MySql;
$mysql = new MySql();

实际执行代码的时候是 new \DB\MySql(); 找不到这个文件的时候就会调用你的autoload函数 并file_exists("DB/MySql.class.php"),在当前目录下查找这个文件,在找不到的情况下然后就是你看到的错误

Xee:在被调用的MySql.class.php文件中,也要有\DB\MySql的命名空间)

第三:

如果刚开始了解php命名空间,去看如何使用PHP命名空间;多翻翻使用命名空间的框架的源码,如micro-mvc,slim等。

还有PSR-4——新鲜出炉的PHP规范,其中就有这个:

 *      // register the base directories for the namespace prefix
 *      $loader->addNamespace('Foo\Bar', '/path/to/packages/foo-bar/src');
 *      $loader->addNamespace('Foo\Bar', '/path/to/packages/foo-bar/tests');

第四:

我们常用 db\mysql,这种形式的命名空间!不是一定要使用\这个反斜线的,还可以使用例如:db::mysql;或者db_mysql等;要在自动查找类的函数方法中进行分析.

PHP命名空间 namespace 如何实现自动加载>


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
PHP发送post请求发布时间:2022-07-10
下一篇:
php二维数组排序详解:array_multisort发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap