2011-04-02 61 views
6

这是一个简单的问题谷歌似乎并没有解决一个小时。你如何在PHP中捕获失败的包含?对于以下代码:尝试抓住一个失败的包括

try { 
    include_once 'mythical_file'; 
} catch (Exception $e) { 
    exit('Fatal'); 
} 

echo '?'; 

随着mythical_file不存在,我得到输出'?'。我知道PHP不能捕获失败的需求,因为它会触发警告错误,但在这里?发现失败的最佳方法是什么?例如,下面的工作:

(include_once 'unicorn') or exit('!'); 

,但它并没有触发异常,所以我不能检索文件,行和堆栈环境。

+0

你可能想看看[register_s hutdown_function()](http://php.net/manual/en/function.register-shutdown-function.php)与[error_get_last()](http://php.net/manual/en/function)结合使用。错误得到-last.php)。应该能够检索文件,行等 – billrichards 2015-06-26 00:08:32

回答

2

您可以使用require_once代替include_once

+0

嗯,我想我将不得不关闭票,因为它显然在我的一些虚拟主机和其他没有(使用require会触发500错误)的作品。无论如何,感谢您的帮助! – fabjoa 2011-04-02 06:56:25

+1

@fabjoa,@Gaurav - 我们这里没有“门票”,所以没有什么可关闭的。 – Dori 2011-04-03 06:24:49

1

includeinclude_once触发警告(E_WARNING)requirerequire_once触发错误(E_COMPILE_ERROR)。所以你应该使用requirerequire_once

php.net报价:

“需要()是相同的包括() 除在失败时它也将 产生致命 E_COMPILE_ERROR水平 误差换言之,它将停止。 脚本,而包括()只 发出警告(E_WARNING),这 允许脚本继续。“

+0

除非你绝对必须使用'_once',否则会影响性能。 – transilvlad 2014-04-11 18:11:13

+0

@tntu你能解释一下吗?我的理解是,当文件已经被包含时使用require或include会比使用_once浪费更多的资源。谢谢! – billrichards 2014-11-06 17:07:14

+0

@billrichards如果你编写好的代码,你永远不应该遇到两次包含同一个文件的情况。解释性能差异是什么在这里解释:http://stackoverflow.com/questions/186338/why-is-require-once-so-bad-to-use – transilvlad 2014-11-07 09:39:25