Мне нужно настроить свой объект следующим образом:
$obj->foo = 'bar';
то после того, как это установлено, мне нужно, чтобы следующее было верно
if($obj['foo'] == 'bar'){ //more code here }
Попробуйте расширить ArrayObject
Просто добавьте implements ArrayAccess
в свой класс и добавьте необходимые методы:
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, если вы хотите получить доступ к вашему классу как к массиву, так и к классу.
Вы можете обращаться к объекту PHP как к массиву PHP, но по-разному. Попробуй это:
$obj->{'foo'}
Это похоже на доступ к массиву следующим образом:
$arr['foo']
Вы также можете сделать это:
$propertyName = 'foo'; $obj->$propertyName; // same like first example
Ваш объект должен реализовать интерфейс ArrayAccess
, тогда PHP позволит вам использовать квадратные скобки, подобные этому.
Вы также можете использовать объект как массив:
if((array)$obj['foo'] == 'bar'){ //more code here }
Вы также можете использовать 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 () те две разные переменные