我有一个类,它基本上运行一对匹配的数组来进行一些纠错:
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";,这应该可以避免每次创建类的新对象时实例化该变量。