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
}
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
}
Intenta extender ArrayObject
Simplemente agregue implements ArrayAccess
a su clase y agregue los métodos necesarios:
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:
ArrayAccess::offsetExists
: Si existe o no una compensación.ArrayAccess::offsetGet
: Devuelve el valor en el desplazamiento especificado.ArrayAccess::offsetSet
: Asigna un valor al desplazamiento especificado.ArrayAccess::offsetUnset
: Desactiva una compensación.No es un ejemplo completo en la página del manual de Señalé ;-)
@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 ^^ –
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.
Su objeto debe implementar la interfaz ArrayAccess
, entonces PHP permitirá utilizar los corchetes por el estilo.
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'];
También puede convertir el objeto en forma de matriz:
if((array)$obj['foo'] == 'bar'){
//more code here
}
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
Upvoting because syntactical sugar. – aross
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
tengo esta clase Obj extiende ArrayObject {} Pero cuando estoy haciendo mi prueba de unidad obtengo una falla en lo anterior. – oxfletchox
sí, ahora necesita definir su función __get() y __set(). Por ejemplo, la función __get ($ n) {return $ this [$ n]; } –
Muchas gracias, me faltaba la función auxiliar. – oxfletchox