php使用命名空间时自动加载机制

Posted whyly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php使用命名空间时自动加载机制相关的知识,希望对你有一定的参考价值。

命名空间主要为了解决用户编写的代码与php内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。不过并不是你定义了使用命名空间的类,就可以在任何地方随意使用了,需要在程序运行时将定义命名空间的类文件加载(include or require)进来。但是如果将所有的命名空间都提前加载进来,显示是不合理的。为此,php有专门的自动加载机制spl_autoload_register。下面我们通过代码来具体看一下:

1.编写a.php文件

 1 namespace namespace_test\\module;
 2 
 3 class a
 4 {
 5     function __construct()
 6     {
 7         echo \'------实例化a------<br>\';
 8     }
 9     
10     function out()
11     {
12         echo \'hello!\';
13     }
14 }

2.编写b.php文件

 1 define(\'ROOT_PATH\', dirname(dirname(__FILE__)));
 2 
 3 function auto_load($class)
 4 {
 5     echo \'auto_load-->class: \'.$class.\'<br>\';
 6     $arr = explode(\'\\\\\', $class);
 7     
 8     if (count($arr) > 0)
 9     {
10         $file = ROOT_PATH."/{$arr[1]}_{$arr[2]}/{$arr[2]}.php";
11     
12         @include_once $file;
13     }
14 }
15 
16 spl_autoload_register("auto_load");
17 
18 echo \'------实例化a之前------<br>\';
19 $obj = new \\namespace_test\\module\\a();
20 echo \'------实例化a之后------<br>\';
21 
22 $obj->out();

文件目录结构如下图:

通过浏览器访问b.php文件,程序运行结果如下:

程序说明:

spl_autoload_register("auto_load")作用是在发现未定义的类时运行auto_load()方法,auto_load的参数$class即为类的完整名称,如上图auto_load-->class所示。程序整个过程如下:

1.当运行到$obj = new \\namespace_test\\module\\a(),发现未定义a;

2.调用auto_load($class)方法,a的完整类名作为参数$class传递给auto_load;

3.通过开发人员的自定义规则解析文件路径,加载a.php文件;

4.实例化a,运行后续程序。

 

最后,说明一下关于命名空间完整类名的定义应尽量遵循PSR-4标准

 

参考:

http://www.cnblogs.com/woider/p/6443854.html
https://laravel-china.org/topics/2081/psr-specification-psr-4-automatic-loading-specification
https://www.php-fig.org/psr/psr-4/

 

以上是关于php使用命名空间时自动加载机制的主要内容,如果未能解决你的问题,请参考以下文章

PHP中的use命名空间引入类文件自动加载类的理解

VSCODE 片段 PHP 自动填充命名空间

现代php编程

使用命名空间和自动加载器找不到类

thinkphp 5.0 命名空间

thinkphp5.0命名空间