为什么PHP类方法中foreach用preg_replace存值到数组无返回也不报错?
问题原因排查与解决方案
核心触发原因
无返回无报错的情况本质是PHP触发致命错误后,错误显示被关闭导致的白屏,最常见的诱因有以下几种:
- 非法数组键类型错误:如果
self::$$cvar遍历出的$key或$value不是字符串类型(比如是数组、对象),preg_replace处理非字符串参数时会返回非字符串结果,将非字符串类型作为数组键赋值时,PHP会抛出Illegal offset type致命错误,直接终止程序运行。 - 内存耗尽:如果
$controllers遍历的数量过多,每个循环都新增数组元素,最终数组体积超出PHP配置的内存上限时,程序会直接终止,无任何输出。 - 动态静态属性不存在:遍历
$controllers时,拼接得到的$cvar对应的类静态属性未定义,访问self::$$cvar时会抛出致命错误。
解决步骤
- 开启错误显示定位具体问题,在方法入口处添加以下代码:
error_reporting(E_ALL); ini_set('display_errors', 1);
重新运行即可看到具体的错误提示,对应修复即可。
2. 针对最常见的非法键类型问题,修改正则判断逻辑,增加字符串类型校验:
// 原判断条件前增加is_string校验 if( is_string($key) && is_string($value) && (preg_match('/[A-Z]/',$key)!==0 || preg_match('/[A-Z]/',$value)!==0) ) { $key2=strtolower(preg_replace('/(?<=\w)([A-Z])/','-\1',$key)); $value2=strtolower(preg_replace('/(?<=\w)([A-Z])/','-\1',$value)); $actions[$value2] = $key2; }
- 如果确认是内存不足导致的,可临时调大内存限制测试:
ini_set('memory_limit', '256M');
调大后恢复正常的情况下,后续建议优化逻辑,避免存储重复冗余的数组元素,降低内存占用。
内容的提问来源于stack exchange,提问作者Miguel Vieira
相关产品推荐
相关产品推荐

