我最近学会了如何在我的php代码中使用@符号,我学会了爱上它。但是,我也被告知@在性能方面并不高效。它提供的优雅是否足以原谅它可能创造或可能不会创造的性能打击。
我实现的一种常见用法是在尝试访问数组时在 if 语句中。
if( $value = @$array['key'] )
// value exists and we can access it
因为它返回 null 而不是显示错误,所以在这种情况下它是一个有用的工具。
以这种方式抑制错误很有用,但不适用于您的示例,因为有更传统的方法来检查这些潜在错误。
我有时会使用它,但通常用于 IO 操作。 例如。
$sample = 'sample.txt';
if (!file_exists($sample)) {
throw new FileNotFoundException($sample);
}
if (!$fp = @fopen('sample.txt', 'r')) {
throw new IOException($sample, error_get_last()['message']);
}
其中的例外是我会创建的类。 目标是打开一个文件进行读取,首先我需要检查文件是否存在,这很容易,如果没有,我可以抛出相关错误。
接下来是打开文件。 好吧,这是一个什么都没有或全有的操作,可能有很多原因导致它不起作用(例如权限(。
如果有一个问题,我想处理问题(在这种情况下通过捕获异常(,所以我抑制了错误(因为我不希望用户看到它(,但我确实想知道发生了什么,所以我捕获异常,将消息记录在某个地方并将用户重定向到其他地方。
我使用 @
是因为我不知道错误可能是什么,并且因为根据 PHP 配置,无论您如何处理返回值,它都会始终触发错误。
不要将其用于按索引获取数组值之类的事情,因为这种情况很少,并且可以在开始操作之前检查它们。
它影响性能的原因是,即使禁止生成错误消息,它仍然会触发 PHP 中的所有错误处理机制。如果禁用 error_reporting(( 和 error_logging((,则会出现同样的问题。
它确实提供了一个快速修复解决方案,但是您描述的方案也可以通过以下方式实现:
$value = isset($array['key']) ? $array['key'] : null;
不会触发错误。