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

我应该在php代码中使用at符号(@),php,performance,Php,Performance,我最近学会了如何在php代码中使用@符号,我也学会了喜欢它。然而,我也被告知,@在性能方面并不高效。它所提供的优雅足以原谅它可能会或可能不会造成的性能损失 我实现的一个常见用法是在尝试访问数组时使用if语句 if( $value = @$array['key'] ) // value exists and we can access it 因为它返回null而不是显示错误,所以在这种情况下它是一个有用的工具。以这种方式抑制错误是有用的,但对于您的示例来说不是,因为有更传统的方法来检查这些潜在的

我最近学会了如何在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']);
}
这里的异常是我本应该创建的类。目标是打开一个文件进行读取,首先我需要检查文件是否存在,这很简单,如果不存在,我可以抛出相关错误

下一步是打开文件。好吧,这是一个什么都不做或全部都不做的操作,可能有很多原因导致它不能工作,例如

$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配置,无论您如何处理返回值,它都会触发错误


不要将它用于像通过索引获取数组值这样的事情,因为这方面的问题很少,并且在开始操作之前可以检查所有问题。

以这种方式抑制错误是有用的,但对于您的示例来说不是,因为有更传统的方法来检查这些潜在的错误

我有时使用它,但通常用于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']);
}
这里的异常是我本应该创建的类。目标是打开一个文件进行读取,首先我需要检查文件是否存在,这很简单,如果不存在,我可以抛出相关错误

下一步是打开文件。好吧,这是一个什么都不做或全部都不做的操作,可能有很多原因导致它不能工作,例如

$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中的所有错误处理机制。如果禁用错误报告和错误日志记录,则会出现相同的问题

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

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

不会触发错误。

它影响性能的原因是,即使错误表的生成被抑制,它仍然会触发PHP中的所有错误处理机制。如果禁用错误报告和错误日志记录,则会出现相同的问题

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

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

不会触发错误。

。告诉我们您尝试了什么,以及为什么它不能满足您的需求。这表明你已经花了时间来帮助自己,它避免了我们重复显而易见的答案,最重要的是它帮助你得到一个更具体和相关的答案。同时也看到了可能的重复,目前它已经满足了我的所有需求,我担心随着我扩展应用程序,这种技术可能会造成潜在的损害。当你说性能时,你是说CPU周期吗,或者因为有用的警告消息被抑制而考虑花费额外的调试时间?学习@does并将其与术语performance结合使用是荒谬的。您喜欢错误抑制,但担心性能。这引发了两个问题-1您是否存在性能问题,2您为什么选择抑制错误而不是无错误。你看,包含错误并且程序员故意抑制错误的代码表明程序员在这一点上真的知道得不够多。但是程序员担心性能——难道程序员不应该首先确保没有错误吗?。告诉我们您尝试了什么,以及为什么它不能满足您的需求。这表明你?