PHP类中在方法外声明数组属性为何会导致错误信息重复输出?
问题根源:类属性的持久化存储 vs 方法内的重置操作
这个重复显示的问题本质上是类属性的状态持久化导致的,和你使用的PHP 7.4.24版本关系不大,咱们一步步拆解来理解:
第一种写法的问题:错误数组持续累加
当你在类属性声明处直接初始化public $error = array();时,这个数组会和PumpErrors的实例绑定,只要实例存在,数组里的内容就会一直保留。
看你firstOfAll()方法的逻辑:
public function firstOfAll() { $i = 0; foreach($this->pumpdat as $val){ if(!is_numeric($val)){ $err = $this->welldat[$i].' must be a number and cannot be blank. Use 0 for no amount pumped.'; $this->error[] = $err; // 往已有的数组里追加错误 } $i++; } return $this->error; }
每次调用这个方法,都会遍历pumpdat并把错误追加到已经存在的$error数组里。如果这个方法被调用了两次(比如你在模板渲染前不小心调用了一次,模板里又调用了一次),错误就会被重复添加两次,最终遍历输出时自然会显示重复内容。
第二种写法的修复:每次调用都重置错误数组
而当你把$this->error = array();放到firstOfAll()方法开头时,每次调用这个方法都会先把错误数组清空,再重新收集错误:
public function firstOfAll() { $this->error = array(); // 先清空数组,从头开始收集 $i = 0; foreach($this->pumpdat as $val){ // ... 收集错误的逻辑 } return $this->error; }
不管这个方法被调用多少次,每次都会从空数组开始重新生成错误列表,自然不会出现重复的错误信息。
为什么dump时没发现多维数组?
因为错误不是嵌套的,而是同一个错误字符串被多次添加到一维数组里,比如数组内容是:
[ "Pump 12 must be a number...", "Pump 12 must be a number..." ]
所以dump出来就是两个相同的字符串,不是多维数组,这和你的观察一致。
额外排查点:为什么方法会被调用多次?
你可以检查代码流程,比如:
- 是否在初始化
$errors实例后、模板渲染前,不小心调用过$errors->firstOfAll()? - 模板里的循环逻辑有没有语法问题(比如你示例代码里
foreach的闭合标签位置似乎不对,可能导致意外的重复执行)?
内容的提问来源于stack exchange,提问作者apags
相关产品推荐
相关产品推荐

