Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP自动加载程序:忽略不存在的include_Php_Error Handling_Autoload - Fatal编程技术网

PHP自动加载程序:忽略不存在的include

PHP自动加载程序:忽略不存在的include,php,error-handling,autoload,Php,Error Handling,Autoload,我的自动加载器有问题: public function loadClass($className) { $file = str_replace(array('_', '\\'), '/', $className) . '.php'; include_once $file; } 正如你所看到的,这很简单。我只是推导出类的文件名,并尝试将其包含在内。不过我有个问题;我在尝试加载一个不存在的类时遇到异常(因为我有一个抛出异常的错误处理程序)。这很不方便,因为在不存在的类上使用类_ex

我的自动加载器有问题:

public function loadClass($className) {
    $file = str_replace(array('_', '\\'), '/', $className) . '.php';
    include_once $file;
}
正如你所看到的,这很简单。我只是推导出类的文件名,并尝试将其包含在内。不过我有个问题;我在尝试加载一个不存在的类时遇到异常(因为我有一个抛出异常的错误处理程序)。这很不方便,因为在不存在的类上使用类_exists()时也会触发它。您不希望出现异常,只返回一个“false”

我早些时候通过在include前面加一个@(消除所有错误)修复了这个问题。不过,这种方法的一大缺点是,该include中的任何解析器/编译器错误(致命的)都不会出现(甚至不会出现在日志中),从而导致难以发现的bug

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

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


(解决)这样做:

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;
                    }
    }

}
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;
                    }
    }

}

每个类只调用一次,所以性能应该不是问题

 public function loadClass($className) {
     $file = str_replace(array('_', '\\'), '/', $className) . '.php';
     if(is_readable($file))
       include_once $file;
 }
可读性不会产生巨大的性能差异。

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

(已解决)如下所示:

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;
                    }
    }

}
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;
                    }
    }

}

除此之外,我必须对每个include路径执行此操作(我想平均有4个)。我知道,如果我将其设置为false,则整个函数对我来说都是无用的。;)