PHP-PHP自动加载和命名空间原理解析
概念
》什么是autoload?
- 自动加载的原理,就是在我们实例化一个 class 的时候,PHP如果找不到这个类,就会去自动调用本文件中的 __autoload($class_name) 方法,我们new的这个class_name 就成为这个方法的参数。所以我们就可以在这个方法中根据我们需要new class_name的各种判断和划分就去require对应的路径类文件,从而实现自动加载。
》什么是namespace?
在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:
- 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
- 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
手动实现
通过__autoload()函数实现(不推荐,未来将会去除该函数)
当前目录创建autoload.php文件,文件名随意。
<?php function __autoload($className) { require './' . $className . '.php'; }
在需要实现自动加载的文件内部适当位置引入autoload.php
require './autoload.php';
- 问题:__autoload()函数全局只能有一个,这种方式只适合简单的场景,比如同目录下文件自动加载,复杂场景就不适合了。
通过spl_autoload_register()函数实现自动加载和命名空间支持
当前目录创建autoload.php文件,文件名随意。
<?php spl_autoload_register('myAutoload01'); spl_autoload_register('myAutoload02'); // 以当前文件所在目录上级目录为根目录 function myAutoload01($class) { $class = str_replace('\\', '/', $class); $file = '../' . $class . '.php'; if (file_exists($file)) { require $file; } } // 以当前文件所在目录为根目录 function myAutoload02($class) { $class = str_replace('\\', '/', $class); $file = './' . $class . '.php'; if (file_exists($file)) { require $file; } }
在需要实现自动加载的文件内部适当位置引入autoload.php
<?php namespace test; use Lib\IocTest; require './autoload.php'; IocTest::test1();
- 优点:支持调用多次自动加载,适用复杂场景,比如现在主流框架的composer自动加载.
- 注意:如果用spl_autoload_register(),__autoload()就失效了。