2010-01-05 15 views
17

tengo que ser capaz de configurar mi objeto como éste:PHP objeto como matriz

$obj->foo = 'bar'; 

a continuación, después de que se establece que necesito que lo siguiente es cierto

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

Respuesta

13

Intenta extender ArrayObject

+0

tengo esta clase Obj extiende ArrayObject {} Pero cuando estoy haciendo mi prueba de unidad obtengo una falla en lo anterior. – oxfletchox

+1

sí, ahora necesita definir su función __get() y __set(). Por ejemplo, la función __get ($ n) {return $ this [$ n]; } –

+0

Muchas gracias, me faltaba la función auxiliar. – oxfletchox

14

Simplemente agregue implements ArrayAccess a su clase y agregue los métodos necesarios:

  • offsetExists de función pública (offset $)
  • función pública offsetGet ($ offset)
  • función pública offsetSet ($ offset, valor $)
  • función pública offsetUnset ($ desplazamiento)

Ver http://php.net/manual/en/class.arrayaccess.php

9

Vas a tener que implementar la interfaz ArrayAccess ser capaz de hacer eso - que sólo significa implementar algunas (4 para ser exactos) métodos simples:

No es un ejemplo completo en la página del manual de Señalé ;-)

+0

@Gordon: ergh, gracias! En general, copio y pego los nombres de las clases/métodos para evitar ese tipo de error ... Esta vez pensé "Puedo escribir esto" ... Bueno, parece que no ^^ –

8

Estás objetos y matrices de mezcla. Puede crear y acceder a un objeto de este modo:

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

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

y una gran variedad de este modo:

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

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

se puede definir una clase y añadir implementos ArrayAccess si desea acceder a su clase ya que tanto una matriz y una clase.

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

3

Su objeto debe implementar la interfaz ArrayAccess, entonces PHP permitirá utilizar los corchetes por el estilo.

13

ArrayObject implementa la interfaz ArrayAccess (y más). Con el indicador ARRAY_AS_PROPS, proporciona la funcionalidad que está buscando.

$obj = new ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS); 
$obj->foo = 'bar'; 
echo $obj['foo']; 

alternativa, se puede implementar la interfaz ArrayAccess en una de sus propias clases:

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

También puede convertir el objeto en forma de matriz:

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

Se puede acceder a objetos de PHP como matriz de PHP, pero de diferentes maneras. Prueba esto:

$obj->{'foo'} 

que es similar con acceso a la matriz de esta manera:

$arr['foo'] 

También puede hacer esto:

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

Upvoting because syntactical sugar. – aross

1

mejorar la capacidad de la clase sin funcionalidad inconvenientes

También puede usar ArrayAccess para acceder a una sola propiedad de matriz en su clase y dejar otra Se está accediendo a las operaciones en modo OOP. Sin embargo, seguirá funcionando como lo solicitó.

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; 
    } 

    ... 

} 

Lo anterior funcionará como esperaba.

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

También tenga en cuenta que los Foo [ 'nombre'] ! == foo-> getName() esas dos variables diferentes a

Cuestiones relacionadas