мне нужно, чтобы быть в состоянии установить свой объект, как это:PHP объект как массив
$obj->foo = 'bar';
то после этого устанавливается мне нужно следующее, чтобы быть правдой
if($obj['foo'] == 'bar'){
//more code here
}
мне нужно, чтобы быть в состоянии установить свой объект, как это:PHP объект как массив
$obj->foo = 'bar';
то после этого устанавливается мне нужно следующее, чтобы быть правдой
if($obj['foo'] == 'bar'){
//more code here
}
Попробуйте простирающийся ArrayObject
Просто добавьте implements ArrayAccess
к вашему классу и добавьте искомые методы:
Вы должны реализовать интерфейс ArrayAccess
, чтобы быть в состоянии сделать это - это означает только реализацию нескольких (4, чтобы быть точным) Простые методы:
ArrayAccess::offsetExists
: Независимо от того, существует или нет смещение.ArrayAccess::offsetGet
: Возвращает значение при указанном смещении.ArrayAccess::offsetSet
: Назначает значение указанному смещению.ArrayAccess::offsetUnset
: отменяет смещение.Существует полный пример на странице данного руководства я указал ;-)
@ Gordon: ergh, спасибо! Я вообще копирую-вставляю имена классов/методов, чтобы избежать такой ошибки ... На этот раз я подумал: «Я могу напечатать это» ... Ну, похоже, это не ^^ –
Вы смешивания объектов и массивов. Вы можете создать и получить доступ к объекту, как так:
$obj = new stdClass;
$obj->foo = 'bar';
if($obj->foo == 'bar'){
// true
}
и массив так:
$obj = new Array();
$obj['foo'] = 'bar';
if($obj['foo'] == 'bar'){
// true
}
Вы можете определить класс и добавить инвентарь ArrayAccess, если вы хотите получить доступ к классу и как массив и класс.
Ваш объект должен реализовать интерфейс ArrayAccess
, то PHP позволит использовать квадратные скобки, как это.
ArrayObject реализует интерфейс ArrayAccess (и еще несколько). Используя флаг ARRAY_AS_PROPS, он предоставляет функциональность, которую вы ищете.
$obj = new ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS);
$obj->foo = 'bar';
echo $obj['foo'];
В качестве альтернативы вы можете реализовать интерфейс ArrayAccess в одном из ваших собственных классов:
class Foo implements ArrayAccess {
public function offsetExists($offset) {
return isset($this->$offset);
}
public function offsetGet($offset) {
return $this->$offset;
}
public function offsetSet($offset , $value) {
$this->$offset = $value;
}
public function offsetUnset($offset) {
unset($this->$offset);
}
}
$obj = new Foo;
$obj->foo = 'bar';
echo $obj['foo'];
Вы также можете бросить объект как массив:
if((array)$obj['foo'] == 'bar'){
//more code here
}
Вы можете получить доступ к PHP объект как PHP-массив, но по-разному. Попробуйте это:
$obj->{'foo'}
Это аналогично с доступом массив как это:
$arr['foo']
Вы также можете сделать это:
$propertyName = 'foo';
$obj->$propertyName; // same like first example
Упрощение из-за синтаксического сахара. – aross
Вы также можете использовать ArrayAccess для доступа к одному свойству массива в своем классе и оставить другие pr доступ к операциям в ООП. Тем не менее, он будет работать, как вы просили.
class Foo implements \ArrayAccess
{
/**
* mixed[] now you can access this array using your object
* like a normal array Foo['something'] = 'blablabla'; echo Foo['something']; ... and so on
* other properties will remain accessed as normal: $Foo->getName();
*/
private myArrayOptions = [];
private $name = 'lala';
...
public function offsetExists($offset)
{
return isset($this->myArrayOptions[$offset]);
}
public function offsetGet($offset)
{
if ($this->offsetExists($offset)) {
return $this->myArrayOptions[$offset];
}
return null; // or throw the exception;
}
public function offsetSet($offset, $value)
{
$this->myArrayOptions[$offset] = $value;
}
public function offsetUnset($offset)
{
unset($this->myArrayOptions[$offset]);
}
public function getName()
{
return $this->name;
}
public function __set($offset, $value){
$this->myArrayOptions[$offset] = $value;
}
...
}
Вышеупомянутое будет работать так, как вы ожидали.
$obj->foo = 'bar';
if($obj['foo'] == 'bar'){
echo "WoWo";
}
Также отметим, что Foo [ 'имя'] ! == foo-> GetName() эти две а различные переменные
У меня есть этот класс Obj расширяет ArrayObject {} Но когда я выполняю мое модульное тестирование, я получаю отказ от вышеуказанного. – oxfletchox
Да, теперь вам нужно определить там функции __get() и __set(). Например, функция __get ($ n) {return $ this [$ n]; } –
Большое спасибо, я пропустил вспомогательную функцию. – oxfletchox