用count()修复WordPress插件中sizeof引发的PHP新版本报错问题
方案合理性说明
你当前的修改是完全合理且可以解决高版本PHP报错问题的,原因如下:
sizeof本质是count的别名,两者功能完全一致,高版本PHP(7.2及以上)会对非可计数类型(比如null、非数组的标量值)调用count/sizeof抛出E_WARNING警告,这就是你升级PHP后报错的根本原因:当页面没有子页面时,$page_info[$front_page]['children']的取值大概率为null而非空数组,原代码直接调用sizeof就会触发警告。- 你采用的
count((array)$变量)写法,通过强制类型转换把所有非数组类型的值统一转为数组:如果原变量是null会转为空数组,count结果为0,完全符合原代码的判断逻辑;如果原变量本身就是数组,转换后取值不变,也不会影响判断,同时完全避免了非可计数类型的报错。
潜在的可优化点
你的修改已经可以覆盖绝大多数正常场景,仅存在极端情况下的逻辑隐患:如果$page_info[$front_page]['children']在异常场景下返回了字符串、数字等非数组非空值,强制转为数组后的count结果会大于0,可能误判为存在子页面,和原代码的预期逻辑不符。
如果需要更严谨的兼容方案,可以根据你的PHP版本选择对应写法:
- PHP 7.3及以上版本,用
is_countable判断:
if (($args['show_home'] == 'yes') || (is_countable($page_info[$front_page]['children']) && count($page_info[$front_page]['children']))) { $page_info[$front_page]['show'] = 1; // always show front page }
- 需要兼容更低PHP版本的话,用
is_array判断:
if (($args['show_home'] == 'yes') || (is_array($page_info[$front_page]['children']) && count($page_info[$front_page]['children']))) { $page_info[$front_page]['show'] = 1; // always show front page }
以上两种写法的逻辑和原代码的预期完全一致,且不会出现类型转换导致的误判问题。
内容的提问来源于stack exchange,提问作者ultraloveninja
相关产品推荐
相关产品推荐

