簡體   English   中英

如果我在方法之外將屬性聲明為數組,為什么我的 PHP class 似乎在循環?

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

我有一個 class,它基本上通過一對匹配的 arrays 來進行一些糾錯:

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']);

並顯示錯誤,它只按預期顯示一次。

我只是在尋找關於為什么會發生這種情況的解釋。

如果我在開始時將該屬性聲明為一個數組,我會得到 output 的雙倍值。

如果我最初將屬性設置為空,然后在方法內將屬性設置為數組,一切都很好。

我最初認為也許在開始時將它聲明為一個數組導致它成為一個多維數組並且以某種方式循環顯示它只是通過它兩次。 但是 kint 轉儲看起來並沒有發生這種情況。 如果有不止一個錯誤,比如泵 1 和泵 2,那么我會得到這樣的雙打:

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

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

(注意:我出於懶惰將其作為 class 執行此操作,因此我可以使用與 rakit 驗證器相同的錯誤顯示代碼來驗證表單的 rest,我知道有更簡單的方法可以通過數組運行來檢查它。這更多練習看看是否可以用這種方式完成,我偶然發現了這種奇怪的行為。)

編輯:也許是版本問題? 我在本地 7.4.24 上運行它。

在 class 的第一個版本中,您僅在實例化 class 時清除錯誤數組

public $error = array();

但是在第二個版本中,您清除錯誤數組作為方法調用的一部分

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

因此,第一個版本中的錯誤當然會在對firstOfAll()的多次調用中不斷累積,但在第二個版本中,每次調用都會初始化錯誤數組。

如果您將變量定義為“靜態公共 $error”,這應該會在每次創建 class 的新 object 時避免實例化該變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM