PHP 8.1兼容问题:strlen()传null弃用警告及代码修改咨询
解决PHP 8.1中strlen()的弃用警告问题
问题原因
PHP 8.1开始严格禁止向strlen()传递null参数,当你的$strRawText为null时就会触发该警告。同时原代码在参数类型约束、代码效率上也有优化空间。
修改方案
以下是兼容PHP 8.1的优化版本代码,关键改动说明:
- 给参数添加类型声明,明确参数类型,从源头避免非法值传入
- 自动将
$strRawText的null值转为空字符串 - 优化字符串拼接方式(使用
.=替代$a = $a . $b) - 修正
elseIf为PHP规范的elseif - 用
foreach遍历字符替代手动while循环,代码更简洁易读
private function cleanInput2(?string $strRawText, string $strAllowableChars, bool $blnAllowAccentedChars): string { // 处理null输入,转为空字符串 $strRawText = $strRawText ?? ''; $strCleanedText = ""; // 遍历每个字符 foreach (str_split($strRawText) as $chrThisChar) { // 保留允许的字符 if (strpos($strAllowableChars, $chrThisChar) !== false) { $strCleanedText .= $chrThisChar; } elseif ($blnAllowAccentedChars) { // 保留重音字符及高位ASCII字符 if (ord($chrThisChar) >= 191) { $strCleanedText .= $chrThisChar; } } } return $strCleanedText; }
替代方案(保留原循环逻辑)
如果希望保留原有的while循环结构,只需在循环前添加null处理即可:
private function cleanInput2($strRawText, $strAllowableChars, $blnAllowAccentedChars) { $iCharPos = 0; $chrThisChar = ""; $strCleanedText = ""; // 关键:将null转为空字符串,避免strlen()报错 $strRawText = is_null($strRawText) ? '' : $strRawText; //Compare each character based on list of acceptable characters while ($iCharPos < strlen($strRawText)) { $chrThisChar = substr($strRawText, $iCharPos, 1); if (strpos($strAllowableChars, $chrThisChar) !== FALSE) { $strCleanedText .= $chrThisChar; } elseif ($blnAllowAccentedChars == TRUE) { if (ord($chrThisChar) >= 191) { $strCleanedText .= $chrThisChar; } } $iCharPos++; } return $strCleanedText; }
额外说明
- 添加参数类型声明(如
?string表示可空字符串,string表示必填字符串)能让代码更健壮,提前发现错误 - 使用
??空合并运算符是PHP 7+的语法,比is_null()更简洁 - 字符串拼接用
.=比每次重新赋值更高效,尤其适合处理长文本场景
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

