迁移到 PHP 8.1 - 如何修复已弃用的将 null 传递给参数错误 - 重命名内置函数

Migration to PHP 8.1 - how to fix Deprecated Passing null to parameter error - rename build in functions

PHP 8.1 已弃用将 null 作为参数传递给许多函数。主要问题在于“htmlspecialchars”和“trim”等函数,其中 null 不再静默转换为空字符串。 为了通过大量代码解决这个问题,我试图重命名原始内置函数并将它们替换为可以将输入从 null 修复为空字符串的包装器。 主要问题是,函数“rename_function”不再有效,最后一次更新是从 2004 年开始的。 我需要对内置函数进行某种覆盖,以避免每次调用函数时都编写空检查,从而使我的所有代码都变大 x2。 我能想到的唯一其他解决方案是仅使用我的自定义函数,但这仍然需要通过我所有的代码和我拥有的第三方库。

在PHP8.1中,当null传递给内置函数时,它不再被静默转换为空字符串。

首先,要记住两件事:

  1. PHP 8.1 弃用这些调用,不会使它们错误。弃用的目的是提前通知作者修复他们的代码,因此您和您使用的库的作者可以在 PHP 9.0 出来之前修复问题。所以,不要因为不是所有的事情都马上就解决了而惊慌,对库维护者要有耐心,他们会在自己的时间解决这个问题。
  2. 大多数情况下的快速解决方法是使用 the null coalescing operator 提供适当的默认值,这样您就不需要在每次使用时都进行长时间的 null 检查。例如,htmlspecialchars($something) 可以替换为 htmlspecialchars($something ?? '')

接下来,一些选项:

  • 根据您的案例数量,您可以一次手动修复几个案例,添加 ?? '' 或修复您不希望出现 null 的逻辑错误。
  • 创建自定义函数,例如 nullable_htmlspecialchars 并在您的代码中执行 straight-forward 查找和替换。
  • 创建自定义命名空间函数,如 nullableoverride\htmlspecialchars;然后在您添加 use function nullableoverride\htmlspecialchars; 的任何文件中,将使用该函数而不是 built-in 函数。不过,这必须添加到每个文件中,因此您可能需要一个工具来自动添加它。
  • 使用 Rector 自动将 ?? '' 添加到适当的函数调用中,因此您不必手动编辑它们。不幸的是,(目前)似乎还没有针对此的 built-in 规则,因此您必须学会编写自己的规则。
  • 可能更简单,根据您的技能,使用正则表达式 find-and-replace 将 ?? '' 添加到简单的案例中。