2010-01-05 2 views
17

мне нужно, чтобы быть в состоянии установить свой объект, как это:PHP объект как массив

$obj->foo = 'bar'; 

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

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

ответ

13

Попробуйте простирающийся ArrayObject

+0

У меня есть этот класс Obj расширяет ArrayObject {} Но когда я выполняю мое модульное тестирование, я получаю отказ от вышеуказанного. – oxfletchox

+1

Да, теперь вам нужно определить там функции __get() и __set(). Например, функция __get ($ n) {return $ this [$ n]; } –

+0

Большое спасибо, я пропустил вспомогательную функцию. – oxfletchox

14

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

  • публичной функция offsetExists ($ смещения)
  • публичной функция offsetGet ($ смещения)
  • публичной функция offsetSet ($ смещения, $ значение)
  • публичной функция offsetUnset ($ смещения)

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

9

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

Существует полный пример на странице данного руководства я указал ;-)

+0

@ Gordon: ergh, спасибо! Я вообще копирую-вставляю имена классов/методов, чтобы избежать такой ошибки ... На этот раз я подумал: «Я могу напечатать это» ... Ну, похоже, это не ^^ –

8

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

$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

3

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

13

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

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

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

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

$obj->{'foo'} 

Это аналогично с доступом массив как это:

$arr['foo'] 

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

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

Упрощение из-за синтаксического сахара. – aross

1

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

Вы также можете использовать ArrayAccess для доступа к одному свойству массива в своем классе и оставить другие pr доступ к операциям в ООП. Тем не менее, он будет работать, как вы просили.

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 [ 'имя'] ! == foo-> GetName() эти две а различные переменные

Смежные вопросы