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


Should I use the at symbol (@) in my php code

我最近学会了如何在我的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;

不会触发错误。