2012-05-10 2 views
3

Как получить доступ к массиву элемента из следующего массива объекта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] => 
    ) 

) 
+0

Возможно ли, чтобы вы добавили публичную функцию getItems() в класс Cart? – gunnx

+0

Вы спрашиваете, * «Как получить доступ к собственному/защищенному объекту?» * -or- * «Как заставить объект действовать как массив?» * – rdlowrey

+0

Я просил получить доступ к элементам – nbhatti2001

ответ

1

Что-то вроде этого, может быть:

$object->_items[index]->_productId 

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

$reflectionObject = new ReflectionObject($yourObject); 
    $property = $reflectionObject->getProperty('_items'); 
    $property->setAccessible(true); 
    $items = $property->getValue($yourObject); 
+0

$ object -> _ items должны возвращать массив элементов. но это не так. как я могу получить массив элементов. Нужно преобразовать его в общедоступный – nbhatti2001

+0

см. Обновленный ответ –

+0

одна вещь, что этот код работал на локальном компьютере, но проблема с сервером. любой ключ? – nbhatti2001

0

Попробуйте следующее:

$object->$first_node->$second_node->$third_node; 
+0

Это частный, поэтому, вероятно, не вариант. –

4

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

class MyClass 
{ 
    private $_items; 

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

UPDATE

После повторного чтения, кажется, вы просто хотите, чтобы ваш объект вести себя как массив. Для этого вам необходимо реализовать 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.

+0

. Я соглашаюсь с запредельным оператором, но учитывая тот факт, что мы не знаем интерфейс класса, мы должны его рассмотреть. Вот почему размышления, я думаю. IMHO –

+0

... достаточно ... – rdlowrey

Смежные вопросы