for - Objeto PHP como matriz
php object (9)
Mejora la capacidad de clase sin inconvenientes de funcionalidad
También puede usar ArrayAccess para acceder a una propiedad de matriz única en su clase y dejar que otras propiedades sean accedidas de forma POP. Sin embargo, todavía funcionará como usted 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 esperabas.
$obj->foo = ''bar'';
if($obj[''foo''] == ''bar''){
echo "WoWo";
}
También tenga en cuenta que Foo [''nombre''] ! == Foo-> getName () son dos variables diferentes
Necesito poder configurar mi objeto de esta manera:
$obj->foo = ''bar'';
luego, después de eso, tengo que hacer lo siguiente
if($obj[''foo''] == ''bar''){
//more code here
}
Estás mezclando objetos y matrices. Puedes crear y acceder a un objeto así:
$obj = new stdClass;
$obj->foo = ''bar'';
if($obj->foo == ''bar''){
// true
}
y una matriz como tal:
$obj = new Array();
$obj[''foo''] = ''bar'';
if($obj[''foo''] == ''bar''){
// true
}
Puede definir una clase y agregar implementos ArrayAccess si desea acceder a su clase como una matriz y una clase.
Intenta extender ArrayObject
También necesitarás implementar un __get
Método Mágico" como mencionó Valentin Golev.
Tu clase tendrá que ser algo como esto:
Class myClass extends ArrayObject {
// class property definitions...
public function __construct()
{
//Do Stuff
}
public function __get($n) { return $this[$n]; }
// Other methods
}
Puede acceder al objeto PHP como matriz PHP, pero de diferentes maneras. Prueba esto:
$obj->{''foo''}
Eso es similar con el acceso a una matriz como esta:
$arr[''foo'']
También puedes hacer esto:
$propertyName = ''foo'';
$obj->$propertyName; // same like first example
Solo agregue implements ArrayAccess
a su clase y agregue los métodos requeridos:
- Función pública offsetExists ($ offset)
- función pública offsetGet ($ offset)
- función pública offsetSet ($ offset, $ valor)
- función pública offsetUnset ($ offset)
Su objeto debe implementar la interfaz ArrayAccess
, luego PHP le permitirá usar los corchetes de esa manera.
También puedes lanzar el objeto como una matriz:
if((array)$obj[''foo''] == ''bar''){
//more code here
}
Tendrá que implementar la interfaz http://php.net/manual/en/class.arrayaccess.php para poder hacer eso, lo que solo significa implementar algunos métodos simples (4 para ser exactos) :
-
ArrayAccess::offsetExists
: si existe o no un desplazamiento. -
ArrayAccess::offsetGet
: devuelve el valor en el desplazamiento especificado. -
ArrayAccess::offsetSet
:ArrayAccess::offsetSet
un valor al desplazamiento especificado. - y
ArrayAccess::offsetUnset
: Anula una compensación.
Hay un ejemplo completo en la página del manual que señalé ;-)
ArrayObject implementa la interfaz ArrayAccess (y algunas más). Al utilizar 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''];
Alternativamente, 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''];