【问题标题】:Is it alright to suppress/hide PHP notices?禁止/隐藏 PHP 通知可以吗?
【发布时间】:2011-10-30 06:37:46
【问题描述】:

我已经压制通知很长一段时间了,没有任何问题,但我开始怀疑我是否做对了。我似乎找不到任何合乎逻辑的理由为什么我不应该压制它们,但其他一些人似乎认为使用 error_reporting 压制它们是一件可怕的事情,但为什么呢?

我能找到的最接近答案的是this question,但这与我正在寻找的答案相去甚远。隐藏 PHP 生成的所有通知是否有某种不可预见的缺点?例如,由于出现错误,要将来自 POST 调用的变量包含回表单中,我会简单地使用:

<?= $_POST['variable'] ?>

这将生成一个 PHP 通知。要修复该通知,我可以使用以下内容:

<?= isset($_POST['variable']) ? $_POST['variable'] : '' ?>

但是,这真的有必要吗?我的代码实际上是否会从这样做中受益,而不仅仅是回显变量是否存在并可能创建 PHP 通知?在我看来,能够忽略通知是使用 PHP 的一个好处,因为这样您就不必担心是否定义了变量,尤其是对于像这样的例子,它似乎并不重要。

我还利用 PHP 的能力,根据变量的使用方式自动更改变量的类型/转换,您经常会发现如下代码 sn-ps:

for ($i = 0; $i < $limit; $i++) $results[] = $i; // Example

$results 之前没有定义,但是当我尝试将新项目作为数组添加到其中时,它变成了一个数组。我有点喜欢这样做,因为如果没有结果被添加到数组中并且我需要存储该信息或出于任何原因将其转换为 JSON,那么将不会定义该特定变量,从而节省额外的带宽,即使它是分钟。

$data = stdClass; // For reference, in my case this would be defined before this code
$data->results = array();
$limit = 0;
for ($i = 0; $i < $limit; $i++) $data->results[] = $i;
print json_encode($data);
// {"results":[]}

$data = stdClass; // For reference
$limit = 0;
for ($i = 0; $i < $limit; $i++) $data->results[] = $i;
print json_encode($data);
// []

问题又来了:如果有的话,我从修复通知错误中获得什么真正的好处,而不是仅仅抑制它们?它如何/会损害我的代码?

【问题讨论】:

  • then that particular variable will not be defined and thus save additional bandwidth --- 协议违规怎么办?任何著名的 API(例如 twitter 和 FB)都会返回一致的结果。如果指定结果将在数组results 中,那么它将在那里,无论是否为空。
  • API 一致性很重要。想象一下 API 的用户和您一样,正在寻找数组 [结果]。哦,是的,您没有结果选项,而可怜的家伙也在寻找它。现在你有问题了。
  • 在这些讨论中,人们总是宣称只有一种解决方案可以解决所有问题。您展示的两种情况在结构上非常不同。在第一种情况下忽略通知不会产生事实后果,而在第二种情况下会利用一种可以实际上改变结果的语言语义。
  • 如果您是一位经验丰富的程序员和开发人员,并且您需要使用 PHP 作为您工作的一部分,那么这是 PHP 缺乏 统一异常处理的(不受欢迎的)解决方法之一 ...仔细想想。如果它不能解决某人对某个问题的想法,那为什么用语言at all stackoverflow.com/questions/1087365

标签: php suppress-warnings notice


【解决方案1】:

在我看来,你永远不应该压制错误,任何类型的错误,通知与否。它现在可能会给您带来一些便利,但是在以后的过程中,您在维护代码时会遇到很多很多问题。

假设你有一个变量,你想像上面的第一个例子一样回显。是的,使用 isset 有点复杂,但也许您的应用程序无论如何都应该处理特殊的空情况,从而改善体验。示例:

if (isset($var)) {
    echo $var;
} else {
    echo "Nothing is found. Try again later.";
}

如果您只有echo $var;,并且如果这是用户正在阅读的面向公众的视图,那么他们将在那里什么也看不到,这可能会导致混淆。当然,这只是修复 PHP 通知可以改进您的应用程序的一种特殊情况。

当您在 PHP 代码中处理通知时,不应将其视为麻烦或不便,因为代码应该是干净的。当我在源代码中打开它时,我宁愿拥有一个无通知的代码,而不是看到干净的代码。当然,两者肯定更好! :)

同样,这些错误(即使它们不是致命的)会在未来引发问题。如果你已经在做echo $var; 之类的事情而不检查它,那是一个假设存在一个变量,即使你知道它可能不存在,它只会让你养成假设事物存在的习惯并且工作。这现在可能很小,但过一段时间你会发现你会给自己带来很多很多问题。

这些通知是有原因的。如果我们都在代码中使用error_reporting(E_ALL ^ E_NOTICE),那么我们只是对我们的代码不负责任。如果你能够解决它,那你为什么懒惰而不这样做呢?当然,发布带有通知的 1.0,稍后修复它们,这就是我们所说的。但最好将其作为一种习惯,第一次编写完美的代码。如果您花 15 分钟编写受通知困扰的代码,然后在以后的开发时间中花费 2 小时修复它们,为什么不先花一个半小时完善代码呢? ?

编写好的代码应该是一种习惯,而不是一种不便。 错误消息是有原因的。尊重它们,修复它们,然后,你就是一个负责任的程序员。

您还为代码的未来维护者铺平了道路。

【讨论】:

  • You also pave a path for future maintainers of your code.:太真实了!!如果您因为开发人员不关心通知或压制通知而发现错误,您会讨厌他。也可能是你!
  • 我个人维护了 50 多个非常糟糕的项目......呃。我有在我的代码中添加error_reporting(E_ALL); 的习惯,结果是,我收到了成千上万的先前程序员留下的通知。当然,我可以通过修复它们来获得更多的计费时间,但这很头疼......
  • @Jimmie Lin 我完全同意!通知错误可能对结果没有影响,但它始终被认为是一种良好的编程习惯,可以防止通知首先出现(而不是简单地抑制它们)
  • 打压他们是不负责任的行为。即使你用“截止日期临近”来证明它是合理的。不过,如果你这样做是为了科学……哈哈
  • 由于 PHP 的实现方式,在某些情况下您必须使用 @。最好的例子是使用mail()。无法保证邮件服务器会启动,因此您需要检测成功/失败并正确处理。不幸的是,没有$Success = @mail(...) 这样的东西,PHP 会输出错误。
【解决方案2】:

假设您有一个不应该忽略的通知。 此通知将隐藏在您通常忽略的所有通知中。

恕我直言,不应忽略警告。您应该始终注意警告以防止错误。每次我在日志文件中看到通知时,我都会将其视为错误。

另外,如果有很多用户访问您的网站,您将获得一个非常大的日志文件。

【讨论】:

  • 是的,必须同意你的观点,不过,我的“错误”事情延伸到通知和警告。注意 = 警告 = 错误 = 致命错误 = 不应该出现。 :)
【解决方案3】:

根据我的经验,通知通常表明您的代码中某处存在错误的可能性很大,通常是您希望在某个点设置某个变量但有些情况并非如此,您会开始想知道为什么您的页面的某些部分没有显示或开始随机崩溃。

当然,计算机并不是那么聪明,在某些情况下代码足够清晰并且您不在乎是否有任何警告,但这就是 @ 运算符的用途。

【讨论】:

  • 现在别修了,他们总有一天会回来找你的。我很难学到这一点,因此我决定解决问题。
【解决方案4】:

我非常不同意某些建议您永远不应该隐藏通知的 cmets。如果您知道自己在做什么,我确实认为使用 @ 非常有用,尤其是对于处理未设置的变量或数组元素。不要误会我的意思:我同意在没有经验或草率的程序员手中,@ 可能是邪恶的。但是,请考虑以下示例:

public function foo ($array) {
    if (isset ($array[0])) {
        $bar = $array[0];
    } else {
        $bar = null;
    }

    // do something with $bar
}

在功能上与

相同
public function foo ($array) {
    $bar = @$array[0];

    // do something with $bar
}

但恕我直言,可读性较差,打字工作量更大。在这些类型的情况下,我知道有两种可能性:设置了变量或未设置变量。我不提前知道,但我必须在这两种情况下进行。在这种情况下,我认为使用 @ 没有任何问题。是的,你也可以写

public function foo ($array) {
    $bar = isset ($array[0]) ? $array[0] : null;

    // do something with $bar
}

但我发现这只稍微好一点。对我来说,代码的可读性和简洁性本身就是价值,而在我看来,用 isset-tests 膨胀代码有点愚蠢。

当然,如果我没记错的话,使用 @ 会花费更多时间来执行 isset 测试,但老实说:我们的代码中有多少是真正的性能关键?在执行了无数次的循环中,我可能会改用 isset,但在大多数情况下,它对用户没有任何影响。

【讨论】:

  • 但这不是一个惯用的模式,大多数 PHP 开发人员会想知道为什么最初的作者要禁止警告。你提出的更像是一种黑客攻击。此外,可读性不等于简洁。我发现后一个例子更具可读性。如果简洁和可读性对您很重要,为什么不为此编写一个函数呢?
  • 我明白你的意思。以这种方式使用 @ 作为简写是一种黑客行为,人们也倾向于对此持相当教条的态度,如果他们看到它,如果不是无能的话,至少会假设是懒惰。这就是我想反对的——它可以负责任地使用。但我可能更愿意看到的是一个 PHP 习惯用法,它不(ab)使用@。一个函数可以在这个特定的例子中工作(例如“array_value_or_null ($array, 0)”),但在其他情况下它不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-27
相关资源
最近更新 更多