gpt4 book ai didi

php - spl_autoload_register - 如何防止 fatal error

转载 作者:行者123 更新时间:2023-12-02 04:56:12 24 4
gpt4 key购买 nike

我有以下函数来加载我的库:

function load_class($name) {
$namePath = explode('_', $name);
$filePath = '';
if (is_array($namePath)) {
for ($i=0; $i<sizeof($namePath); $i++) {
$filePath .= $namePath[$i];
if ($i != sizeof($namePath) - 1) $filePath .= '/';
}
} else $filePath = $name;
if (is_file($filePath . '.php')) require_once($filePath . '.php');
else if (is_file($filePath . '.class.php')) require_once($filePath . '.class.php');
else throw new Exception('Unable to load class: ' . $name . '. No such file or a directory. ');
if (!class_exists($name)) throw new Exception('Class: ' . $name . ' doesn\'t exists. ');
}

和自动加载:

function __construct() {

try {
spl_autoload_register(array($this, 'load_class'));
} catch (Exception $e) {
echo $e -> getMessage();
}

}

但不幸的是,异常并不能阻止我遇到 fatal error ,例如没有类或没有文件。有没有一种优雅的方式只向用户显示我自己的通信,而不是 php 错误?

最佳答案

有一件事:spl_autoload_register 不会抛出异常。所以根本没有必要将该调用包装到 try/catch 中——它永远不会发生任何事情!它唯一返回的是一个 bool 值:成功时为 true,失败时为 false,这可能只有在您尝试注册一个不存在的函数,或者您传递了一些不可调用的东西时才会发生。

第二件事:做个好公民,不要在你自己的函数中取消自动加载过程!如果您或任何其他人将您的自动加载器与第二个自动加载器一起使用,就像正在使用任何其他具有自己的自动加载器的库的情况一样,那么所有这些自动加载器都可能会使用类名调用,并且只有负责该自动加载器的那个类必须加载它。

所以如果你的自动加载器不能加载这个类,它就什么都不做。不抛出任何异常,不触发错误。如果它被定义,PHP 将在你的之后调用另一个自动加载函数,如果没有,你会得到那个讨厌的“ fatal error :找不到类'Foobar\InexistentClass'”。这是一件好事,因为您正在使用无法加载的类 - 要么是因为拼写错误,要么是自动加载器中的错误,要么是其他原因。

还有一件事:您真的不必使用 require_once() 进行加载。自动加载器只会被触发一次来加载一个类。 require_once() 有性能损失,因为 PHP 必须检查文件之前是否已加载 - 并且此检查永远不会阻止第二次加载,因为自动加载器永远不会为已知的第二次调用类。

如果无法加载类,如何防止 fatal error ?不可能的!理论上,自动加载器可以被编码为运行 eval() tp 创建所需的类作为一个没有任何函数的空代码片段,或者甚至可能使用指定的 __set、__get 和 __call 魔术函数来拦截任何使用,但这有什么帮助呢?您的代码需要一个执行某项操作的类,但找不到该类!这确实是一个 fatal error ,应该解决,而不是隐藏。

最后的建议:使用 PSR-0 autoloading standard .已经有很多自动加载器,它是任何像样的库的事实标准。这将使每个人的生活变得更加轻松。

更新:

您可以安装自己的错误处理程序,它在 PHP 错误时执行:set_error_handler()但这对 fatal error 没有帮助。

关于php - spl_autoload_register - 如何防止 fatal error ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17931299/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com