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


    示例:

    #/DB/MySql.class.php也就是DB文件夹下有MySql.class.php文件
    
    namespace DB;
    
    class MySql
    {
    
        public function __construct()
        {
            var_dump(__FILE__);
        }
    }
    #/index.php
    
    namespace Home;
    
    use DBMySql;
    
    $mysql = new MySql();

    报错

    Fatal error: Class 'DBMySql' not found in D:localhostdemospaceindex.php on line 23
    

    修改

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

    namespace Home;
    
    use DBMySql;
    
    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 DBMySql;
    $mysql = new MySql();

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

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

    第三:

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

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

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

    第四:

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

    <参考:PHP命名空间 namespace 如何实现自动加载>

    没有人告诉你,生活会是这样:你工作无趣,你袋里没钱,你的爱情总是昙花一现;妈妈警告过你,会有这样的日子但她没有告诉你,世界将让你屈服。但是,别怕,有我在你身边,谁让我们是friends呢……
  • 相关阅读:
    Django框架03 /视图相关
    Django框架02 /Django下载安装、url路由分发
    Django框架01 / http协议、web框架本质
    前端09 /jQuery标签操作、事件、补充
    前端08 /jQuery标签操作、事件
    前端07 /jQuery初识
    Public key for mysql....rpm is not installed
    无参数实例化Configuration对象以及addResource无法加载core-site.xml中的内容
    Permission denied user=hadoop access=WRITE inode=root rootsupergroup rwxr
    MaxTemperature程序Mapper ClassNotFoundException
  • 原文地址:https://www.cnblogs.com/ChandlerVer5/p/php_namespace.html
Copyright © 2020-2023  润新知