我的应用程序中有很多foreaches,我想自动执行该过程,并检查创建的数组是否为空。所以,基本上这是我的旧代码:
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
}
但我不是!我做错了什么?
谢谢!
答案 0 :(得分:0)
做$ this-> $ metric = ...意味着你制作一个局部变量,类似$ metric。 但如果您删除$ this-> ** $ **指标中的额外$,则为yes,该类的属性。 并且您应该通过执行以下操作来修改属性对公众的可见性:
public $metric;
http://php.net/manual/en/language.oop5.visibility.php
在类中但不在函数内部。 所以: class 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;
}
}
您也可以使用functions。
答案 1 :(得分:0)
我猜你的CheckMetric课程有两个错误。
首先迭代$valueArray
但您需要$metricArray
中的特定指标名称作为关键字。切换循环。首先是$metricArray
,而是内圈$valueArray
。
在课堂上设置不存在的属性。是的,这是有效的,但如果您设置一个属性,例如" metric2",魔法吸气剂__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]
: [];
}
}