多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 3-2 类自动载入 最早的PHP是通过手动的 `include` 或 `require` 来载入依赖的文件的。如果依赖的文件越来越多,比如需要依赖几十个类文件,就需要手动 `include` 或 `require` 几十行。这样管理起来其实很不方便,而且某个类如果删除了,也会导致致命的错误。 因此,在PHP5.1.2之后就提供了类的自动载入功能。 出处:[PHP:类的自动加载](http://php.net/manual/zh/language.oop5.autoload.php) ### 1. 准备: 手动载入实例 *D:\wamp\www\demo\oop\test1.php* ~~~ <?php namespace Test1; class Test { static function test() { echo __METHOD__; } } ~~~ *D:\wamp\www\demo\oop\test2.php* ~~~ <?php namespace Test2; class Test { static function test() { echo __METHOD__; } } ~~~ *D:\wamp\www\demo\oop\test.php* ~~~ <?php require "./test1.php"; require "./test2.php"; Test1\Test::test(); echo "</br>"; Test2\Test::test(); ~~~ 输出结果: ~~~ Test1\Test::test Test2\Test::test ~~~ 我们使用的`require`引入了类,下面我们将不再使用`require`手动引入类文件,而是使用`__autoload__`自动加载类文件。 [`__autoload__`尝试加载未定义的类](http://php.net/manual/zh/function.autoload.php) ### 2. 使用__autoload__实现自动加载 > 注意:PSR-0 规定类名要和文件名一致,所以下面我们也将类文件的首字母大写了,因为我们在自动加载时,会自动获取未定义的类名作为参数,来载入对应的类。 *D:\wamp\www\demo\oop\test.php* ~~~ <?php Test1::test(); echo "</br>"; Test2::test(); function __autoload($class) { require __DIR__ . '/' . $class . '.php'; } ~~~ *D:\wamp\www\demo\oop\Test1.php* ~~~ <?php class Test1 { static function test() { echo __METHOD__; } } ~~~ *D:\wamp\www\demo\oop\Test2.php* ~~~ <?php class Test2 { static function test() { echo __METHOD__; } } ~~~ 输出结果: ~~~ Test1::test Test2::test ~~~ 可以看到,我们现在不需要手动加载类了,就自动加载到文件中。 但该方法后面慢慢废弃了,因为如果1个文件都重复定义了`__autoload__`,就会报2个函数重名的错误。 于是出现了 [spl_autoload_register()](http://php.net/manual/zh/function.spl-autoload-register.php) 取代 `__autoload__` 。它的特点是允许在1个PHP文件中出现多次。 ### 3. spl_autoload_register()实现自动载入 *D:\wamp\www\demo\oop\test.php* 改进后: ~~~ <?php spl_autoload_register('autoload'); // 该函数可以在1个PHP文件中出现多次 Test1::test(); echo "</br>"; Test2::test(); function autoload($class) { require __DIR__ . '/' . $class . '.php'; } ~~~