PHP-объект, подобный массиву

Мне нужно настроить свой объект следующим образом:

$obj->foo = 'bar'; 

то после того, как это установлено, мне нужно, чтобы следующее было верно

 if($obj['foo'] == 'bar'){ //more code here } 

Related of "PHP-объект, подобный массиву"

Попробуйте расширить ArrayObject

Просто добавьте implements ArrayAccess в свой класс и добавьте необходимые методы:

  • публичная функция offsetExists ($ offset)
  • public function offsetGet ($ offset)
  • public function offsetSet ($ offset, $ value)
  • смещение публичной функцииUnset ($ offset)

См. http://php.net/manual/en/class.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']; с 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']; 

Вам нужно будет реализовать интерфейс ArrayAccess чтобы иметь возможность сделать это – что означает только реализацию нескольких (4, если быть точным) простых методов:

  • ArrayAccess::offsetExists : существует или нет смещение.
  • ArrayAccess::offsetGet : возвращает значение при указанном смещении.
  • ArrayAccess::offsetSet : присваивает значение указанному смещению.
  • и ArrayAccess::offsetUnset : отменяет смещение.

Существует полный пример на странице руководства, на которую я указал 😉

Вы смешиваете объекты и массивы. Вы можете создать и получить доступ к объекту следующим образом:

 $obj = new stdClass; $obj->foo = 'bar'; if($obj->foo == 'bar'){ // true } 

и массив вроде так:

 $obj = new Array(); $obj['foo'] = 'bar'; if($obj['foo'] == 'bar'){ // true } 

Вы можете определить класс и добавить объекты ArrayAccess, если вы хотите получить доступ к вашему классу как к массиву, так и к классу.

http://www.php.net/manual/en/language.oop5.php

Вы можете обращаться к объекту PHP как к массиву PHP, но по-разному. Попробуй это:

 $obj->{'foo'} 

Это похоже на доступ к массиву следующим образом:

 $arr['foo'] 

Вы также можете сделать это:

 $propertyName = 'foo'; $obj->$propertyName; // same like first example 

Ваш объект должен реализовать интерфейс ArrayAccess , тогда PHP позволит вам использовать квадратные скобки, подобные этому.

Вы также можете использовать объект как массив:

 if((array)$obj['foo'] == 'bar'){ //more code here } 

Усиление класса, без функциональности drowbacks

Вы также можете использовать ArrayAccess для доступа к единому массиву в своем классе и оставлять другие возможности, доступные в ООП. Тем не менее, он будет работать, как вы просили.

 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 properities will remaind accesed 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; } ... } не 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 properities will remaind accesed 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 ['name'] ! == Foo-> getName () те две разные переменные