PHP 自动加载器和命名空间


PHP autoloader and namespaces

通常,我看到复杂的自动加载解决方案,要求用户使用一组预定义的路径/目录来补充它们,以便在自动加载类时查看这些路径/目录。或者他们有一个复杂的类似 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
  • 如果你想包含来自其他人(例如作曲家)的库或东西,你会遇到问题,你的自动加载器将被覆盖,这些文件不会被加载(如果这不是必需的,无需担心)