【问题标题】:Can I hide PHP Warning: Undefined array key without suppressing all other warnings?我可以隐藏 PHP Warning: Undefined array key 而不抑制所有其他警告吗?
【发布时间】:2023-01-05 19:39:16
【问题描述】:

因此,看起来他们改变了使用未知键访问数组引发消息的方式。

<?php
if($myArray['foo']) { ... }

25 年来,这只是发出通知,人们很乐意在php.ini 中沉默E_NOTICE。对于(我认为)PhP 8.0,这现在会引发警告。

出于显而易见的原因,我不想让 E_WARNING 保持沉默,所以我(以及世界上所有其他多年来使用未初始化变量的人,因为他们的值只是 null,就像许多其他解释语言一样)正在寻找一种消除与未定义变量/数组/键相关的警告的可能方法,同时继续报告所有其他(更严重的)编程错误,例如包含不存在的文件。

这个问题背后的原因是我必须处理大量以上述模式编写的代码;我只是不能全部重写,但我仍然需要切换到 PhP 8,所以不,我不是在问如何使用isset()

【问题讨论】:

  • 我不这么认为。无法按特定类型的消息进行过滤,您只有不同的错误类别。
  • 您可能不会问如何使用isset(),但这肯定是专业解决您的 XY 问题的方法之一。 PHP8 正在帮助开发人员停止编写错误代码其他25年。
  • 也许考虑不显示ini_set('display_errors', 'Off');,但记录错误。 ini_set('log_errors', 'On');。全部记录:ini_set('error_reporting', E_ALL );
  • @berend 请重读问题标题。我可以隐藏 PHP 警告:未定义的数组键吗不抑制所有其他警告
  • 教训是你也不应该一直忽视这些通知。

标签: php error-handling warnings isset


【解决方案1】:

您可以定义一个绕过该特定警告的 set_error_handler 函数。当回调返回 true 时,它​​不会触发 php 错误处理并且什么都不做,在所有其他情况下(返回 false)它将使用默认的错误处理。在这里查看更多:https://www.php.net/manual/en/function.set-error-handler.php

set_error_handler(function(int $errno, string $errstr) {
    if ((strpos($errstr, 'Undefined array key') === false) && (strpos($errstr, 'Undefined variable') === false)) {
        return false;
    } else {
        return true;
    }
}, E_WARNING);

【讨论】:

  • 您的答案可以通过其他支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以在in the help center找到更多关于如何写出好的答案的信息。
【解决方案2】:

使用Error Suppression operator@

<?php
if(@$myArray['foo']) { ... }

它不如 isset() 好,但至少它清楚地告诉读者您时不时会遇到无效索引。

是时候还清你的technical debt了。

【讨论】:

  • 谁说在 PhP < 8 中访问未定义的变量是一种技术债务?如果语言允许,不测试变量的存在是一种选择。
  • @Jack 是的,不测试变量的存在是一种选择,但你必须忍受后果,这意味着通知或警告。
  • 那么为什么要把别人的工作判断为技术债呢?作为参考,我认为当 manual 多年来声明时,您不应该承担任何后果不需要初始化变量.这只是其业余设计的另一个 PhP 结果。
  • 另请注意,在许多脚本语言中完全允许读取未定义的变量;你能想象下一个版本的 bash 要求你在使用变量之前声明变量吗?世界上一半的电脑无法启动
猜你喜欢
  • 2022-12-19
  • 2020-07-31
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
  • 2017-06-10
  • 2011-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多