PHP объект как массив - PullRequest
       6

PHP объект как массив

22 голосов
/ 05 января 2010

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

$obj->foo = 'bar';

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

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

Ответы [ 9 ]

17 голосов
/ 05 января 2010

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

  • открытая функция offsetExists ($ offset)
  • открытая функция offsetGet ($ offset)
  • открытая функция offsetSet ($ offset, $ value)
  • открытая функция offsetUnset ($ offset)

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

16 голосов
/ 05 января 2010

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

Вам также понадобится реализовать __get Магический метод , как упоминал Валентин Голев.

Ваш класс должен выглядеть примерно так:

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

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

    // Other methods
}
15 голосов
/ 05 января 2010

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'];
9 голосов
/ 05 января 2010

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

$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

9 голосов
/ 05 января 2010

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

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

7 голосов
/ 17 июля 2013

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

$obj->{'foo'}

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

$arr['foo']

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

$propertyName = 'foo';
$obj->$propertyName; // same like first example
3 голосов
/ 05 января 2010

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

1 голос
/ 13 мая 2017

Возможность расширения класса без функциональных недостатков

Вы также можете использовать 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 properties will remain accessed 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 () это две разные переменные

1 голос
/ 05 января 2010

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

if((array)$obj['foo'] == 'bar'){
  //more code here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...