【问题标题】:PHP 8: Any way to avoid fatal error when passing non-countable values to count function?有没有办法让 PHP $_POST 中的数组计数而不用它前缀数组?
【发布时间】:2022-11-09 23:16:40
【问题描述】:

所以我升级到 PHP 8 并运行我的脚本,这给了我这个错误:

致命错误:未捕获的类型错误:count():参数 #1 ($value) 必须是 Countable|array 类型,在 C:\xampp\htdocs\app\includes\functions\create_session.php:78 中给出 null
堆栈跟踪:
#0 C:\xampp\htdocs\public\front_desk.php(508): 会话->check_subfeature_access(22, 0)
#1 {main} 在第 78 行的 C:\xampp\htdocs\app\includes\functions\create_session.php 中抛出

事实证明,这是由于 PHP 8 中的新更新不允许在 count 函数中使用非数组值并引发致命错误,从而停止进一步的脚本执行。例如,如果你有一个$_POST['checkboxes_checked'] 并且你做了count($_POST['checkboxes_checked']) 那么它会给出上述错误,因为默认情况下它不会将它识别为一个数组。要修复此错误,您可以执行以下操作:count((array)$_POST['checkboxes_checked'])),它可以修复问题。

但是,就我而言,问题是我有几百个文件需要修复这个问题,我不想进入每个文件并修复它,因为那将非常耗时。有没有办法将 PHP 8 配置为忽略这一点并继续使用这些 $_POST 参数进行计数功能?或者某种搜索/替换正则表达式,我可以在所有将count($_POST['some_parameter_name']) 替换为count((array)$_POST['some_parameter_name'])) 的文件上运行?老实说,我不知道如何在不手动进入每个文件的情况下解决这个问题,这就是我需要你帮助的部分。

【问题讨论】:

  • 错误,$_POST 是一个数组,但没有理由假设 $_POST['checkboxes_checked'] 是一个数组,因为没有选中复选框,它甚至不存在。所以实际上问题是草率的编码
  • 类似于 RiggsFolly 的评论(在我发布我的评论前几​​秒钟出现)......除非你是期待POST 数据的特定项目中的数组,你为什么要首先尝试计算它?当然,当您编写代码时,您会知道它是要提交一个数组还是单个值。
  • @RiggsFolly 嗯,你说得有道理,我只是尝试了相同的代码,没有选中任何复选框并使用 PHP 7.3 服务器提交,结果发现,数组不存在,因为没有单击名称为的复选框checkboxes_checked[]
  • @KIKOSoftware 在做之前三思而后行。您不想对整个网络上使用的东西负责,例如用作假 SQL 注入保护器的可怕 ClearUp() 函数:)
  • @RiggsFolly:哈哈,是的,那不好。我只是想提供一个临时解决方案。最后,编写或修改代码的人要为他们所做的事情负责。

标签: php php-8


【解决方案1】:

一种临时解决方案是定义您自己的 count() 函数。例如:

/**
 * @deprecated Temporary solution for count() TypeError on invalid countables
 */

function oldCount($input)
{
   return isset($input) && is_array($input) ? count($input) : 0;
}

这只是一个简单的例子。你也可以使用(array) 的东西。

现在您需要做的就是将代码中所有出现的count( 替换为oldCount(,就完成了。

警告:这只是一个临时解决方案。每次使用它都需要一个额外的函数调用,而且 PHP 8 并没有包含更严格的检查:它可以保护你。尽快更新您的代码。

【讨论】:

  • 感谢您的回答,我建议您写一个小警告,不要在生产中使用它,因为这只是修补临时问题的解决方案。
  • 我会的,我认为 RiggsFolly 有道理。
  • 我建议将此文档块放在此方法之上:/** * @deprecated **/ 这将向任何人表明这是临时的,稍后将被替换:) 编辑:意外提交得太早^^
  • @Fanmade 我添加了文档块。不是每个人都会使用这种类型的文档,但它不会受到伤害。
  • @KIKOSoftware 谢谢。是的,我知道。但是由于阅读现有代码是编程的重要组成部分,我了解到为比简单的 getter 更复杂的任何东西提供一点上下文可以极大地改善开发人员的体验。如果添加了这个 doc 块,像 PhpStorm 这样的适当工具甚至会强烈提示任何人不应再使用此方法,这通常有助于长期提高代码质量:)
猜你喜欢
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
  • 1970-01-01
  • 2020-12-05
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
相关资源
最近更新 更多