将 null 传递给不可为 null 的内部函数参数 - 将现有代码库更新到 php 8.1
Passing null to non-nullable internal function parameters - Updating Existing Code Base to php 8.1
我刚刚开始将我的代码升级为 php 8.1 兼容。我有很多代码片段,我将潜在的空值传递给内部函数。
if (strlen($row) > 0) {
...
}
其中 $row 来自可能具有空值的源(例如查询)。
我正在寻找最简单最省时的方法来处理升级此代码,例如修复可以进行全局搜索和替换的地方。似乎在不改变功能的情况下,对我传递给内部函数的变量进行类型转换。
error_reporting(E_ALL);
$row = null;
if (strlen((string) $row) > 0) {
...
}
除了以这种方式编码的道德方面之外,这种内部函数方法是否存在问题?有没有更好的方法(除了完全重写代码和以不同方式处理空值)?我更喜欢此解决方案向后兼容 v7.4,尽管我可能会接受 8.0 兼容性。
我知道我的用户定义函数有其他选择。
如果您明确尝试处理 null
的情况,那么稍微更简洁的修复方法是 strlen($row ?? '')
使用“空合并运算符”。
在大多数情况下,这两者可能是等价的,但实际上 strict_types=1
,如果值是可以转换为字符串的其他类型,它们的行为会有所不同:
declare(strict_types=1);
$row = 42;
echo strlen($row); // TypeError: must be of type string, int given
echo strlen((string) $row); // Succeeds, outputting '2'
echo strlen($row ?? ''); // TypeError: must be of type string, int given
另一方面,请注意 ??
运算符基于 isset
,而不是 === null
,因此 undefined 变量将行为不同:
declare(strict_types=1);
$row = [];
echo strlen($row['no_such_key']); // Warning: Undefined array key; TypeError: must be of type string, null given
echo strlen((string) $row['no_such_key']); // Warning: Undefined array key; outputs '0'
echo strlen($row['no_such_key'] ?? ''); // No warning, just outputs '0'
如果您关心这种情况,与旧行为最直接等效的代码会更加冗长:
echo strlen($row === null ? '' : $row);
我刚刚开始将我的代码升级为 php 8.1 兼容。我有很多代码片段,我将潜在的空值传递给内部函数。
if (strlen($row) > 0) {
...
}
其中 $row 来自可能具有空值的源(例如查询)。
我正在寻找最简单最省时的方法来处理升级此代码,例如修复可以进行全局搜索和替换的地方。似乎在不改变功能的情况下,对我传递给内部函数的变量进行类型转换。
error_reporting(E_ALL);
$row = null;
if (strlen((string) $row) > 0) {
...
}
除了以这种方式编码的道德方面之外,这种内部函数方法是否存在问题?有没有更好的方法(除了完全重写代码和以不同方式处理空值)?我更喜欢此解决方案向后兼容 v7.4,尽管我可能会接受 8.0 兼容性。
我知道我的用户定义函数有其他选择。
如果您明确尝试处理 null
的情况,那么稍微更简洁的修复方法是 strlen($row ?? '')
使用“空合并运算符”。
在大多数情况下,这两者可能是等价的,但实际上 strict_types=1
,如果值是可以转换为字符串的其他类型,它们的行为会有所不同:
declare(strict_types=1);
$row = 42;
echo strlen($row); // TypeError: must be of type string, int given
echo strlen((string) $row); // Succeeds, outputting '2'
echo strlen($row ?? ''); // TypeError: must be of type string, int given
另一方面,请注意 ??
运算符基于 isset
,而不是 === null
,因此 undefined 变量将行为不同:
declare(strict_types=1);
$row = [];
echo strlen($row['no_such_key']); // Warning: Undefined array key; TypeError: must be of type string, null given
echo strlen((string) $row['no_such_key']); // Warning: Undefined array key; outputs '0'
echo strlen($row['no_such_key'] ?? ''); // No warning, just outputs '0'
如果您关心这种情况,与旧行为最直接等效的代码会更加冗长:
echo strlen($row === null ? '' : $row);