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] =>
)
)
3 answers
Возможно, что-то вроде этого:
$object->_items[index]->_productId
Но если _items является закрытым, вам понадобится общедоступный геттер или возня с классами отражения. Вы можете настроить, чтобы частное свойство было доступно через свойство ReflectionProperty Попробуйте это:
$reflectionObject = new ReflectionObject($yourObject);
$property = $reflectionObject->getProperty('_items');
$property->setAccessible(true);
$items = $property->getValue($yourObject);
Если вам необходимо получить доступ к закрытому/защищенному свойству класса, вы можете просто использовать волшебный __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
.
Попробуйте выполнить следующее:
$object->$first_node->$second_node->$third_node;