在PHP中循环通过类对象

时间:2018-04-18 12:29:48

标签: php

我试图遍历对象并获取_dBrutto属性的值

object(oxPrice)#428 (6) {
  ["_roundPrices":"oxPrice":private]=>
  bool(true)
  ["_roundPrices":"ZmbEngine_oxPrice":private]=>
  bool(true)
  ["_dBrutto":protected]=>
  float(141.625)
  ["_dNetto":protected]=>
  string(7) "141.625"
  ["_dVat":protected]=>
  float(0)
  ["_blNetPriceMode":protected]=>
  bool(true)
}

我尝试使用代码for循环:

foreach($oxPrice as $oxPrc){
    var_dump($oxPrc);
}

foreach($oxPrice as $oxPrc => $value){
    var_dump($oxPrc, $value);
}

但没有成功。

有任何建议或想法吗? 谢谢。

2 个答案:

答案 0 :(得分:0)

_dBrutto具有受保护的类型,这意味着它只能由自身或扩展oxPrice类的类访问。如果您可以修改此类,请创建一个getter或将该属性设置为public(推荐getter - 公共属性已成熟以供滥用)。

/**
 * @var float
 */
private $_dBrutto;

public function get_dBrutto()
{
    return $this->_dBrutto();
}

然后您可以访问:$oxPrice->get_dBrutto();

如果你不能修改这个课程,那么可能是个原因。你可以强制它,但不推荐它,我只是为了测试的目的,我不想要一个setter或getter方法,但需要测试增量,ID特定值或突变。

所以我们可以使用ReflectionClass

$reflectionClass = new \ReflectionClass(oxPrice::class);
$reflectionProperty = $reflectionClass->getProperty('_dBrutto');
$reflectionProperty->setAccessible(true);
echo $reflectionProperty->getValue($oxPrice); // 141.625

以下是功能的示例用法:

var_dump(getProtectedProperty('_dBrutto', $oxPrice)); // 141.625

setProtectedProperty('_dBrutto', 150.666, $oxPrice);
var_dump(getProtectedProperty('_dBrutto', $oxPrice)); // 150.666

function setProtectedProperty($property, $value, $object)
{
    $reflectionClass = new \ReflectionClass(get_class($object));
    $reflectionProperty = $reflectionClass->getProperty($property);
    $reflectionProperty->setAccessible(true);
    $reflectionProperty->setValue($object, $value);
}

function getProtectedProperty($property, $object)
{
    $reflectionClass = new \ReflectionClass(get_class($object));
    $reflectionProperty = $reflectionClass->getProperty($property);
    $reflectionProperty->setAccessible(true);
    $reflectionProperty->getValue($object);
}

答案 1 :(得分:-2)

您可以直接访问_dBrutto的值而无需循环。 请尝试以下。

var_dump(oxPrice->_dBrutto);