我的应用程序中有很多foreach,我想自动化这个过程,并检查创建的数组是否为空。所以,基本上这是我的旧代码:
foreach ($array as $a) {
$arr1[] = $a->metric
$arr2[] = $a->metric2
}
然后:
if (!empty($arr1)) {
// do stuff with $arr1
}
我认为一个有__construct和__get的类可能会有所帮助。所以,这就是我的方法:
class CheckMetric {
function __contruct($valueArray, $metricArray) {
foreach ($valueArray as $value) {
foreach ($metricArray as $metric) {
$metrics[] = $value->$metric;
}
$this->$metric = $metrics;
}
}
function __get($metric) {
if (empty($this->$metric)) {
return false;
} else {
return true;
}
}
public function returnMetric($metric) {
return $this->$metric;
}
}
现在我想我可以做到这一点:
$metricArray = ['metric1', 'metric2', 'metric3'];
$valueArray = Model::find(); // data from my model
$checkMetric = new CheckMetric($valueArray, $metricArray);
if ($checkMetric->metric1) {
// do stuff with $checkMetric->metric1
}
但我不是!我做错了什么?
谢谢!
我猜您在CheckMetric类中犯了两个错误。
首先对$valueArray
进行迭代,但需要$metricArray
中的特定度量名称作为关键字。切换回路。首先在CCD_ 3上并且在$valueArray
上的内循环中。
在类中,您设置了不存在的属性。是的,这是有效的,但如果你用例如"metric2"设置一个属性,那么神奇的getter __get
将不再执行。因此,请改用受保护/专用阵列作为度量存储。
<?php
class CheckMetric {
/** @var array */
protected $metrics = [];
/**
* @param string[] $valueArray
* @param string[] $metricArray
*/
function __construct($valueArray, $metricArray)
{
foreach ($metricArray as $metric) {
$metrics = [];
foreach ($valueArray as $value) {
$metrics[] = $value->$metric;
}
$this->metrics[$metric] = $metrics;
}
}
/**
* @param string $metric
* @return bool
*/
function __get($metric)
{
return isset($this->metrics[$metric]);
}
/**
* @param string $metric
* @return array
*/
public function returnMetric($metric)
{
return isset($this->metrics[$metric])
? $this->metrics[$metric]
: [];
}
}
执行$this->$metric=。。。意思是你制作一个局部变量,类似于$metric。但是如果您移除$this->**$**度量中的额外$,那么是的,这是类的一个属性。您应该通过以下操作修改该物业对公众的可见性:
public $metric;
http://php.net/manual/en/language.oop5.visibility.php
在类中,但不在函数内部。因此:类CheckMetric{
public $metric;
public function __contruct($valueArray, $metricArray) {
foreach ($valueArray as $value) {
foreach ($metricArray as $metric) {
$metrics[] = $value->$metric;
}
$this->metric = $metrics;
}
}
public function __get($metric) {
if (empty($this->$metric)) {
return false;
} else {
return true;
}
}
public function returnMetric($metric) {
return $this->$metric;
}
}
您也可以使用函数。