【问题标题】:PHP autoloader: ignoring non-existing includePHP自动加载器:忽略不存在的包含
【发布时间】:2009-08-24 18:38:56
【问题描述】:

我的自动加载器有问题:

public function loadClass($className) {
    $file = str_replace(array('_', '\\'), '/', $className) . '.php';
    include_once $file;
}

如您所见,它非常简单。我只是推断出类的文件名并尝试包含它。我有一个问题;尝试加载不存在的类时出现异常(因为我有一个引发异常的错误处理程序)。这很不方便,因为当您在不存在的类上使用 class_exists() 时也会触发它。您不希望那里出现异常,只返回“false”。

我之前通过在包含之前添加一个 @ 来解决此问题(抑制所有错误)。但是,这样做的最大缺点是,此包含中的任何解析器/编译器错误(致命的)都不会显示(甚至在日志中也不会显示),从而导致难以找到错误。

同时解决这两个问题的最佳方法是什么?最简单的方法是在自动加载器中包含这样的内容(伪代码):

foreach (path in the include_path) {
    if (is_readable(the path + the class name)) readable = true;
}
if (!readable) return;

但我担心那里的表现。会不会很痛?


(已解决)是这样的:

public function loadClass($className) {

    $file = str_replace(array('_', '\\'), '/', $className) . '.php';    
    $paths = explode(PATH_SEPARATOR, get_include_path());
    foreach ($paths as $path) {
        if (is_readable($path . '/' . $file)) {
                        include_once $file;
                        return;
                    }
    }

}

【问题讨论】:

    标签: php error-handling autoload


    【解决方案1】:

    每个类只会调用一次,因此性能应该不是问题。

    【讨论】:

      【解决方案2】:
       public function loadClass($className) {
           $file = str_replace(array('_', '\\'), '/', $className) . '.php';
           if(is_readable($file))
             include_once $file;
       }
      

      is_readable 不会产生巨大的性能差异。

      【讨论】:

      • 除了我必须为每个包含路径(我猜平均大约有 4 个)执行此操作。
      【解决方案3】:

      class_exists() 有第二个参数autoload,当设置为 FALSE 时,不会触发不存在类的自动加载器。

      【讨论】:

      • 我知道,如果我将其设置为 false,那么整个函数对我来说毫无用处。 ;)
      【解决方案4】:

      (已解决)是这样的:

      public function loadClass($className) {
      
          $file = str_replace(array('_', '\\'), '/', $className) . '.php';    
          $paths = explode(PATH_SEPARATOR, get_include_path());
          foreach ($paths as $path) {
              if (is_readable($path . '/' . $file)) {
                              include_once $file;
                              return;
                          }
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-08
        • 1970-01-01
        • 2011-12-04
        • 2017-06-16
        相关资源
        最近更新 更多