Подтвердить что ты не робот

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

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

$obj->foo = 'bar';

то после этого мне нужно следующее: true

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

Ответ 1

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

Ответ 2

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

  • публичная функция offsetExists ($ offset)
  • public function offsetGet ($ offset)
  • public function offsetSet ($ offset, $value)
  • public function offsetUnset ($ offset)

См. http://php.net/manual/en/class.arrayaccess.php

Ответ 3

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'];

Ответ 4

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

На странице руководства, на которой я указал, есть полный пример: -)

Ответ 5

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

$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

Ответ 6

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

$obj->{'foo'}

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

$arr['foo']

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

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

Возможность расширения класса без функций 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;
    }

    ...

}

Вышеупомянутое будет работать так, как вы ожидали.

$obj->foo = 'bar';
if($obj['foo'] == 'bar'){
    echo "WoWo";
}

Также обратите внимание, что Foo ['name'] ! == Foo- > getName() те две разные переменные