[英]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.