我应该在我的PHP代码中使用at符号(@)

时间:2014-12-16 19:20:17

标签: php performance

我最近学会了如何在我的PHP代码中使用@符号,并且我学会了喜欢它。但是我也被告知@在性能方面并不高效。它提供的优雅是否足以为它可能会或可能不会创造的性能提供借口。

我实现的一个常见用法是在尝试访问数组时使用if语句。

if( $value = @$array['key'] )
// value exists and we can access it

因为它返回null而不是显示错误,所以在这种情况下它是一个有用的工具。

2 个答案:

答案 0 :(得分:3)

以这种方式抑制错误很有用,但不适用于您的示例,因为有更多传统方法可以检查这些潜在错误。

我有时使用它,但通常用于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配置,无论你对返回值做什么,它总是会触发错误。

不要将它用于通过索引获取数组值之类的东西,因为此类问题很少,并且在开始操作之前都可以检查它们。

答案 1 :(得分:2)

它影响性能的原因是它仍会触发PHP中的所有错误处理机制,即使抑制了错误消息的生成。如果禁用error_reporting()和error_logging(),则会出现同样的问题。

它确实提供了快速解决方案,但您描述的方案也可以通过以下方式实现:

$value = isset($array['key']) ? $array['key'] : null;

不会触发错误。