php как получить доступ к массиву объектов


Как получить доступ к массиву элементов из следующего массива объектов

Cart66Cart Object
(
[_items:Cart66Cart:private] => Array
    (
        [2] => Cart66CartItem Object
            (
                [_productId:Cart66CartItem:private] => 327
                [_quantity:Cart66CartItem:private] => 3
                [_optionInfo:Cart66CartItem:private] => 
                [_priceDifference:Cart66CartItem:private] => 0
                [_customFieldInfo:Cart66CartItem:private] => 
                [_productUrl:Cart66CartItem:private] => http://localhost/odesk/cart66/fran-wilson-aloe-lip-care/
                [_formEntryIds:Cart66CartItem:private] => Array
                    (
                    )

            )

        [3] => Cart66CartItem Object
            (
                [_productId:Cart66CartItem:private] => 368
                [_quantity:Cart66CartItem:private] => 2
                [_optionInfo:Cart66CartItem:private] => 
                [_priceDifference:Cart66CartItem:private] => 0
                [_customFieldInfo:Cart66CartItem:private] => 
                [_productUrl:Cart66CartItem:private] => http://localhost/odesk/cart66/beauty-strokes-basic-shadow-brush/
                [_formEntryIds:Cart66CartItem:private] => Array
                    (
                    )

            )

    )

[_promotion:Cart66Cart:private] => 
[_promoStatus:Cart66Cart:private] => 0
[_shippingMethodId:Cart66Cart:private] => 13
[_liveRates:Cart66Cart:private] => Cart66LiveRates Object
    (
        [toZip] => 
        [weight] => 
        [rates] => Array
            (
            )

        [_toCountryCode:protected] => 
    )

)
Author: ManseUK, 2012-05-10

3 answers

Возможно, что-то вроде этого:

$object->_items[index]->_productId

Но если _items является закрытым, вам понадобится общедоступный геттер или возня с классами отражения. Вы можете настроить, чтобы частное свойство было доступно через свойство ReflectionProperty Попробуйте это:

    $reflectionObject = new ReflectionObject($yourObject);
    $property = $reflectionObject->getProperty('_items');
    $property->setAccessible(true);
    $items = $property->getValue($yourObject);
 1
Author: Vlad Balmos, 2012-05-10 14:36:22

Если вам необходимо получить доступ к закрытому/защищенному свойству класса, вы можете просто использовать волшебный __get метод . В этом случае размышление было бы слишком чрезмерным. Однако имеет ли смысл использовать магические методы в этом случае или нет, зависит от вашей ситуации.

class MyClass
{
    private $_items;

    public function __get($prop)
    {
        if ($prop == '_items') {
            return $this->_items;
        }
        throw new OutOfBoundsException;
    }
}

ОБНОВЛЕНИЕ

После перечитывания кажется, что вы просто хотите, чтобы ваш объект вел себя как массив. Для этого вам нужно будет реализовать ArrayAccess и указать на соответствующие методы для частного $_items свойства.

class MyClass implements ArrayAccess
{
    private $_items = array();

    public function __construct() {
        $this->_items = array(
            "one"   => 1,
            "two"   => 2,
            "three" => 3,
        );
    }
    public function offsetSet($offset, $value) {
        if (is_null($offset)) {
            $this->_items[] = $value;
        } else {
            $this->_items[$offset] = $value;
        }
    }
    public function offsetExists($offset) {
        return isset($this->_items[$offset]);
    }
    public function offsetUnset($offset) {
        unset($this->_items[$offset]);
    }
    public function offsetGet($offset) {
        return isset($this->_items[$offset]) ? $this->_items[$offset] : null;
    }
}

И наконец, PHP поставляется со встроенным ArrayObject класс, который заставит объект вести себя очень похоже на массив. Вы всегда можете использовать это и указать соответствующие методы на частное свойство $_items.

 4
Author: rdlowrey, 2012-05-10 14:42:38

Попробуйте выполнить следующее:

$object->$first_node->$second_node->$third_node;
 0
Author: Adam, 2012-07-18 01:45:14