如果我将 属性 声明为方法外的数组,为什么我的 PHP class 似乎在循环?

Why does my PHP class seem to be looping if I declare a property as an array outside of the method?

我有一个 class 本质上是 运行 通过一对匹配的数组来进行一些纠错:

class PumpErrors {
    public $error = array();
    private $pumpdat;
    private $welldat;
    
    public function __construct($pumpdat, $welldat){
        $this->pumpdat = $pumpdat;
        $this->welldat = $welldat;                            
    }
   
    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;
    }  
}      

$errors = new PumpErrors($_POST['pumpamt'], $_POST['wellid']);

我正在从表格 (POST) 中向 class 提供数组(它是一对匹配的泵的数量和 ID。泵的数量因谁而异使用表格。) 然后我调用主页上的错误来显示错误:

<?php 
if(isset($errors)){
?>
    <div class='form-row justify-content-center'><p class='text-danger'>
<?php   
    foreach($errors->firstOfAll() as $userErrors) { 
        echo $userErrors . '<br />';
    
?>
        </p>
    </div>
<?php 
    } 
?>

这会导致错误显示两次。

Pump 12 must be a number and cannot be blank. Use 0 for no amount pumped.
Pump 12 must be a number and cannot be blank. Use 0 for no amount pumped.

然而

如果我 运行 class 这样:

class PumpErrors {
    public $error;
    private $pumpdat;
    private $welldat;
    
    public function __construct($pumpdat, $welldat){
        $this->pumpdat = $pumpdat;
        $this->welldat = $welldat;                            
    }
   
    public function firstOfAll() {
        $this->error = array();
        $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;
    }  
}     
        
$errors = new PumpErrors($_POST['pumpamt'], $_POST['wellid']);

并显示错误,按预期只显示一次。

我只是在寻找关于为什么会发生这种情况的解释。

如果我在开头将 属性 声明为数组,我会得到双倍的输出。

如果我最初将 属性 设置为空,然后在方法中将 属性 设置为数组,一切都很好。

我最初认为,也许一开始就将其声明为数组导致它成为多维数组,不知何故循环显示它只是经过了两次。但是 kint 转储看起来并没有发生这种情况。如果有不止一个错误,比如泵 1 和泵 2,那么我会得到这样的双打:

Pump 1 (error message)
Pump 2 (error message) 

Pump 1 (error message) 
Pump 2 (error message)

(注意:我出于懒惰而将其作为 class 来执行此操作,因此我可以对表单的其余部分使用与 rakit 验证程序相同的错误显示代码,我知道有更简单的方法 运行 通过数组来检查它。这更像是一个练习,看看它是否可以通过这种方式完成,我偶然发现了这种奇怪的行为。)

编辑:也许是版本问题?我 运行在本地 7.4.24 上安装它。

在 class 的第一个版本中,您仅在实例化 class 时清除错误数组

public $error = array();

但是在第二个版本中,您在方法调用的过程中清除了错误数组

public function firstOfAll() {
    $this->error = array();

因此,第一个版本中的错误当然会在对 firstOfAll() 的多次调用中不断累积,但在第二个版本中,每次调用都会初始化错误数组。

如果您将变量定义为“静态 public $error”,这应该会在每次创建 class 的新对象时避免实例化该变量。