2012-05-10 107 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

你是問,*「如何訪問一個私有/受保護的對象屬性?」* - 或 - *「我如何使對象像一個數組一樣行事?」* – rdlowrey

+0

我要求訪問的項目 – nbhatti2001

回答

1

事情是這樣的,也許:

$object->_items[index]->_productId 

但是如果_items是私人的,你需要一個公共的getter或者與Reflection類混淆。您可以設置私有財產通過ReflectionProperty 可訪問試試這個:

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

$ object - > _ items應該返回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

我同意overboard聲明,但鑑於我們不知道類接口,我們應該考慮它。這就是爲什麼反思,我猜。恕我直言 –

+0

足夠公平... – rdlowrey