如何在循环中访问对象?

时间:2014-02-18 19:17:24

标签: php arrays object foreach

我继承了一些非常难看的代码。名为print_r的变量上的$this->pizza_topping_list返回以下内容(我除了两个“子对象”之外的所有内容都被删除了,但实际上大约有70个。

error_log(print_r($this->pizza_topping_list, 1));

[18-Feb-2014 11:46:52] MenuPizzaToppingList Object
(
    [b_index:MenuPizzaToppingList:private] => Array
        (
            [@] => 36
            [A] => 21
            [B] => 4
        )

    [menu_pizza_toppings:MenuPizzaToppingList:private] => Array
        (
            [0] => MenuPizzaTopping Object
                (
                    [code:MenuPizzaTopping:private] => P
                    [short_description:MenuPizzaTopping:private] => Pepperoni
                    [category:MenuPizzaTopping:private] => M
                )

            [1] => MenuPizzaTopping Object
                (
                    [code:MenuPizzaTopping:private] => B
                    [short_description:MenuPizzaTopping:private] => Barbecue
                    [category:MenuPizzaTopping:private] => S
                )

        )

)

如果我要遍历这个(即foreach($pizzatoppings as $topping),我将如何访问category对象的menu_pizza_toppings属性?我需要一种方法来过滤掉所有类别的项目S.

我尝试了以下内容:

foreach($this->pizza_topping_list['menu_pizza_toppings'] as $tmpTopping) {
   error_log("category: " . $tmpTopping['category']);
}

但是得到一个致命的错误“不能使用MenuPizzaToppingList类型的对象作为数组”。

4 个答案:

答案 0 :(得分:0)

您需要调用$ tmpTopping->类别或可能调用$ tmpTopping-> getCategory(),具体取决于封装。你有对象类的代码吗?

答案 1 :(得分:0)

如果你没有获取menu_pizza_toppings成员的获取者......

试试这个:http://www.php.net/manual/en/reflectionclass.getproperties.php 它是关于在类中进行反射并迭代成员,即使它们是私有的。

补充:http://www.php.net/manual/en/class.reflectionproperty.php(访问属性属性xD,然后使用getValue()访问该值。)

$prop = new ReflectionClass($your_MPTL_instance)->getProperty('menu_pizza_toppings');  
$prop->setAccessible(true);  
$value = $prop->getValue($your_MPTL_instance);  

答案 2 :(得分:0)

$tmpTopping是一个实例对象MenuPizzaTopping,但category是在实例外无法访问的私有成员

答案 3 :(得分:0)

您应该为MenuPizzaTopping类添加一个getter方法。

例如,您可以通过这种方式获得价值:

foreach($this->pizza_topping_list['menu_pizza_toppings'] as $tmpTopping) {
    error_log("category: " . $tmpTopping->getCategory());
}