通常,我看到复杂的自动加载解决方案,要求用户使用一组预定义的路径/目录来补充它们,以便在自动加载类时查看这些路径/目录。或者他们有一个复杂的类似 glob 的搜索,然后构建一个缓存文件以减少查找时间等。
但是,我注意到,只要您为每个类命名,并且这些命名空间与包含它们的目录结构匹配,那么您的自动加载器就不需要比这更复杂:
spl_autoload_register(function ($class) {
include $class . '.php';
});
假设您不必使用非命名空间的第三方类,是否有理由不根据您的文件夹结构为您的类命名,然后让spl_autoload_register为您处理所有事情?
我是否忽略了这个陷阱?
<?php
/**
* Ultra fast class autoloader.
*
* @param string $class
* Fully qualified class name (automatically passed to this magic function by PHP).
*/
function __autoload($class) {
static $ds = DIRECTORY_SEPARATOR;
$class = strtr($class, "''", DIRECTORY_SEPARATOR);
require "{$_SERVER["DOCUMENT_ROOT"]}{$ds}src{$ds}{$class}.php";
}
?>
它有什么好处?
- 我想不出任何更快的实现
- 这是一个普通的函数,而不是闭包
- 魔术函数在 SPL 加载器之前调用
- 适用于所有平台 (
DIRECTORY_SEPARATOR
) - 它创建包含的绝对路径(Linux 路径/文件缓存)
- 它不连接字符串,而是嵌入字符串部分
-
strtr()
是最快的字符串替换功能
缺点
- 只要您的类符合目录结构:none
- 如果你想包含来自其他人(例如作曲家)的库或东西,你会遇到问题,你的自动加载器将被覆盖,这些文件不会被加载(如果这不是必需的,无需担心)