Мне нужно настроить свой объект следующим образом:
$obj->foo = 'bar';
то после этого мне нужно следующее: true
if($obj['foo'] == 'bar'){
//more code here
}
Мне нужно настроить свой объект следующим образом:
$obj->foo = 'bar';
то после этого мне нужно следующее: true
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'];
Вам нужно будет реализовать интерфейс 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;
}
...
}
Вышеупомянутое будет работать так, как вы ожидали.
$obj->foo = 'bar';
if($obj['foo'] == 'bar'){
echo "WoWo";
}
Также обратите внимание, что Foo ['name'] ! == Foo- > getName() те две разные переменные