PHP自动加载器和命名空间

时间:2013-10-16 07:11:42

标签: php namespaces autoload

通常我会看到复杂的自动加载解决方案,需要用户使用预定义的一组路径/目录来对它们进行水合处理,以便在自动加载类时进行查看。或者他们有一个复杂的类似于glob的搜索,然后构建一个缓存文件以减少查找时间等。

但是,我注意到只要你命名每个类,并且这些命名空间与包含它们的目录结构相匹配,那么你的自动加载器不需要比这更复杂:

spl_autoload_register(function ($class) {
    include $class . '.php';
});

假设您不必使用非命名空间的第三方类,是否有理由不根据您的文件夹结构命名您的类,然后让spl_autoload_register为您处理所有事情?

我忽略了这个陷阱吗?

1 个答案:

答案 0 :(得分:0)

<?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加载器之前调用magic函数
  • 适用于所有平台(DIRECTORY_SEPARATOR
  • 它创建包含的绝对路径(Linux路径/文件缓存)
  • 它不会连接字符串,而是嵌入字符串部分
  • strtr()是最快的字符串替换功能

缺点

  • 只要您的类适合目录结构:none
  • 如果你想要包含来自其他人的图书馆或东西(例如作曲家),你会遇到问题,你的自动加载器会被覆盖而且这些文件不会被加载(如果这不是必需的,不用担心)