PHP возражают как массив

Я должен быть в состоянии установить свой объект как это:

$obj->foo = 'bar';

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

if($obj['foo'] == 'bar'){
  //more code here
}
23
задан Jørn Schou-Rode 5 January 2010 в 17:07
поделиться

7 ответов

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

Также необходимо реализовать __get Magic Method, как упоминал Валентин Голев.

Ваш класс должен выглядеть следующим образом:

Class myClass extends ArrayObject {
    // class property definitions...
    public function __construct()
    {
        //Do Stuff
    }

    public function __get($n) { return $this[$n]; }

    // Other methods
}
17
ответ дан 29 November 2019 в 00:47
поделиться

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

  • offsetExists($offset)
  • public function offsetGet($offset)
  • public function offsetSet($offset, $value)
  • offsetUnset($offset)

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

17
ответ дан 29 November 2019 в 00:47
поделиться

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

Полный пример приведен на странице руководства, на которую я указал ;-)

.
9
ответ дан 29 November 2019 в 00:47
поделиться

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

$obj = new stdClass;
$obj->foo = 'bar';

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

и массиву типа so:

$obj = new Array();
$obj['foo'] = 'bar';

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

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

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

9
ответ дан 29 November 2019 в 00:47
поделиться

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

.
3
ответ дан 29 November 2019 в 00:47
поделиться

Вы также можете разыграть объект в виде массива:

if((array)$obj['foo'] == 'bar'){
  //more code here
}
1
ответ дан 29 November 2019 в 00:47
поделиться

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'];
15
ответ дан 29 November 2019 в 00:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: