如果我在方法之外将属性声明为数组,为什么我的PHP类看起来是循环的



我有一个类,它基本上运行一对匹配的数组来进行一些纠错:

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(向类提供数组(它是一对匹配的泵的数量和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 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']);

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

我只是想知道为什么会发生这种事。

如果我在一开始就将属性声明为数组,那么在输出中会得到doubles。

如果我最初将属性设置为none,然后在方法内部将属性设置成数组,那么一切都很好。

我最初认为,也许一开始就把它声明为一个数组会导致它成为一个多维数组,而显示它的循环只经过了两次。但kint垃圾场看起来并没有发生这种事。如果有不止一个错误,比如泵1和泵2,那么我会得到这样的双:

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

(注意:出于懒惰,我把这当成一个类来做,这样我就可以在表单的其余部分使用与rakit验证器相同的错误显示代码,我知道有更简单的方法可以运行数组来检查它。这更多的是一个练习,看看是否可以这样做,我偶然发现了这种奇怪的行为。(

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

在类的第一个版本中,只有当类实例化时,才能清除错误数组

public $error = array();

但在第二个版本中,作为方法调用的一部分,您可以清除错误数组

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

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

如果您将变量定义为;静态公共$error";,这应该可以避免每次创建类的新对象时实例化该变量。

相关内容

  • 没有找到相关文章

最新更新