如果我将 属性 声明为方法外的数组,为什么我的 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 的新对象时避免实例化该变量。
我有一个 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 的新对象时避免实例化该变量。