合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
[**include**](https://www.php.net/manual/zh/function.include.php) 和 [**require**](https://www.php.net/manual/zh/function.require.php) 是 PHP 中引入文件的两个基本方法。小规模开发中可直接使用,但在大型项目中会造成大量的 `include` 和 `require` 堆积,这样的代码执行效率低、维护困难。 为了解决这个问题,部分框架会给出一个引入文件的配置清单,在对象初始化的时候把需要的文件引入。但这只是让代码变得更简洁了一些,引入的效果仍然是差强人意。PHP5 之后,随着 PHP 面向对象支持的完善,[**__autoload**](https://www.php.net/manual/zh/function.autoload.php) 函数才真正使得自动加载成为可能。 - `include `和 `require `功能一样,不同点在于 `include `出错时只会产生警告,而 `require `会抛出错误终止脚本 - `include_once `和 `include `唯一的区别在于 `include_once `会检查文件是否已经引入,如果是则不会重复引入 ## 自动加载 实现自动加载最简单的方式就是使用 `__autoload` 魔术方法。当需要使用的类没有被引入时,这个函数会在 PHP 报错前被触发,未定义的类名会被当作参数传入。 简单测试: ~~~php <?php // 使用未定义的类时,系统自动调用 function __autoload($calss){ echo $calss, PHP_EOL; } new Test(); /** * 输出: * Test * PHP Fatal error: Class 'HelloWorld' not found in ………… */ ~~~ > ps:`__autoload()` 函数已自 PHP 7.2.0 起被*废弃*,并自 PHP 8.0.0 起被*移除*。使用 [spl_autoload_register()](https://www.php.net/manual/zh/function.spl-autoload-register.php) 函数替代 实现一个简单自动加载: test.php ~~~php <?php class Test { function __construct(){ echo '自动加载:', __CLASS__; } } ~~~ ~~~php <?php function autoload($class){ $file = $class . '.php'; if (file_exists($file)) { // 引入PHP文件 include $file; } } spl_autoload_redister('autoload'); new Test(); /** * 输出:自动加载:Test */ ~~~ ## 命名空间 一种标识,它的主要目的是解决命名冲突的问题。 命名空间通过关键字 `namespace `来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间 ~~~php <?php namespace Test1; class HelloWord { public function __construct() { echo ‘Test1 下的 HelloWord’, PHP_EOL; } } ?> ----------------------------------------------- <?php namespace Test2; class HelloWord { public function __construct() { echo ‘Test2 下的 HelloWord’, PHP_EOL; } } ?> ------------------------------------------------- <?php new Test1/HelloWord(); new Test2/HelloWord(); ~~~ ## PSR-4 自动加载规范 https://learnku.com/docs/psr/psr-4-autoloader/1608