如何避免使用strpos()处理空字符串或Null时产生PHP警告?
别担心,这个问题很好解决,而且完全能满足你“不触发警告、不降低性能”的要求,我来一步步给你说清楚:
核心问题分析
你遇到的警告是因为当$db_result为null时,它不是字符串类型,而strpos()的第一个参数要求是字符串。PHP之前会自动把null转成空字符串处理,但这个隐式转换行为在新版本里被标记为废弃,所以触发了警告。
至于警告里提到的chr(),那是针对**用数字作为查找目标(needle)**的场景——比如你如果写了strpos($str, 65),原来PHP会把65当成ASCII码对应的'A',但未来这个行为会被移除,所以需要显式写成strpos($str, chr(65))。但你的情况里$valueToCheckFor是字符串(比如'AP'),所以chr()和你的问题完全无关,可以忽略这个提示。
最优解决方案:强制转换为字符串
最简单高效的修改方式,就是把$db_result强制转换成字符串后再传给strpos(),这样不管它是null还是空字符串,都会被转成空字符串,既符合你的判断逻辑,又不会触发警告,而且性能几乎没有损耗:
if (strpos((string)$db_result, $valueToCheckFor) === false) { // 执行写入操作 }
为什么这个方案好?
- 消除警告:
(string)$db_result确保第一个参数永远是字符串类型,PHP不会再触发隐式转换的废弃警告。 - 性能优异:强制类型转换是PHP内部的轻量操作,比额外加多个条件判断(比如先判断是否为null/空字符串)更快,完全符合你“不降低性能”的要求。
- 逻辑完全匹配:
- 当
$db_result是null→(string)$db_result是空字符串,strpos('', 'AP')返回false→ 执行写入; - 当
$db_result是空字符串 → 同上,返回false→ 执行写入; - 当
$db_result是'fnork' → 找不到'AP',返回false→ 执行写入; - 当
$db_result是'fnorkAP' → 找到位置,返回非false→ 不执行写入。
- 当
其他可选方案(不如强制转换高效)
如果你想先做类型检查再调用strpos(),也可以这样写,但性能略逊于强制转换(因为多了条件判断):
if (empty($db_result) || strpos($db_result, $valueToCheckFor) === false) { // 执行写入操作 }
不过要注意:empty($db_result)会把'0'、0这类值也当成“空”处理,如果你的数据库结果里可能出现这些值,这个方案就不符合需求了。而强制转换的方案则不会有这个问题,因为(string)'0'是'0',strpos('0', 'AP')返回false,会正确执行写入(如果这符合你的预期的话)。
总结:优先选择强制转换为字符串的方案,简洁、高效、无警告,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者WhiteRau

