我最近学会了如何在我的php代码中使用@符号,我已经学会了喜欢它。然而,我也被告知@在性能方面并不是很有效。它提供的优雅足以解释它可能会或可能不会造成的性能损失。
我实现的一种常见用法是在尝试访问数组时使用if语句。
if( $value = @$array['key'] )
// value exists and we can access it
因为它返回null而不是显示错误,所以在这种情况下它是一个有用的工具。
发布于 2014-12-17 10:04:42
以这种方式抑制错误是有用的,但对于您的示例并不有用,因为有更传统的方法来检查这些潜在的错误。
我有时会使用它,但通常用于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配置的不同,无论您如何处理返回值,它总是会触发一个错误。
不要将它用于通过索引获取数组值之类的事情,因为这样做的问题类型很少,并且可以在开始操作之前检查所有问题。
发布于 2014-12-17 13:45:23
它影响性能的原因是,即使错误消息的生成被抑制,它仍然会触发PHP中的所有错误处理机制。如果禁用error_reporting()和error_logging(),也会出现同样的问题。
它确实提供了快速修复解决方案,但是您所描述的场景也可以通过以下方式实现:
$value = isset($array['key']) ? $array['key'] : null;
而不会触发错误。
https://stackoverflow.com/questions/27525782
复制