vacio - Hacer que un objeto PHP se comporte como una matriz?
stdclass object php (2)
Me gustaría poder escribir una clase de PHP que se comporte como una matriz y utilice la sintaxis de matriz normal para obtener y configurar.
Por ejemplo (donde Foo es una clase PHP de mi creación):
$foo = new Foo();
$foo[''fooKey''] = ''foo value'';
echo $foo[''fooKey''];
Sé que PHP tiene los métodos mágicos _get y _set, pero esos no te permiten usar la notación de matriz para acceder a los elementos. Python lo maneja al sobrecargar __getitem__ y __setitem__.
¿Hay alguna manera de hacer esto en PHP? Si hace una diferencia, estoy ejecutando PHP 5.2.
No, el casting solo da como resultado una matriz PHP normal, perdiendo la funcionalidad que tu clase derivada de ArrayObject tenía. Mira esto:
class CaseInsensitiveArray extends ArrayObject {
public function __construct($input = array(), $flags = 0, $iterator_class = ''ArrayIterator'') {
if (isset($input) && is_array($input)) {
$tmpargs = func_get_args();
$tmpargs[0] = array_change_key_case($tmpargs[0], CASE_LOWER);
return call_user_func_array(array(''parent'', __FUNCTION__), $tmp args);
}
return call_user_func_array(array(''parent'', __FUNCTION__), func_get_args());
}
public function offsetExists($index) {
if (is_string($index)) return parent::offsetExists(strtolower($index));
return parent::offsetExists($index);
}
public function offsetGet($index) {
if (is_string($index)) return parent::offsetGet(strtolower($index));
return parent::offsetGet($index);
}
public function offsetSet($index, $value) {
if (is_string($index)) return parent::offsetSet(strtolower($index, $value));
return parent::offsetSet($index, $value);
}
public function offsetUnset($index) {
if (is_string($index)) return parent::offsetUnset(strtolower($index));
return parent::offsetUnset($index);
}
}
$blah = new CaseInsensitiveArray(array(
''A''=>''hello'',
''bcD''=>''goodbye'',
''efg''=>''Aloha'',
));
echo "is array: ".is_array($blah)."/n";
print_r($blah);
print_r(array_keys($blah));
echo $blah[''a'']."/n";
echo $blah[''BCD'']."/n";
echo $blah[''eFg'']."/n";
echo $blah[''A'']."/n";
Como era de esperar, la llamada a array_keys () falla. Además, is_array ($ blah) devuelve falso. Pero si cambia la línea del constructor a:
$blah = (array)new CaseInsensitiveArray(array(
luego obtienes una matriz de PHP normal (is_array ($ blah) devuelve true, y array_keys ($ blah) funciona), pero se pierde toda la funcionalidad de la subclase derivada de ArrayObject (en este caso, las claves que no distinguen entre mayúsculas y minúsculas) trabajo). Intenta ejecutar el código anterior en ambos sentidos, y verás a qué me refiero.
PHP debería proporcionar una matriz nativa en la que las teclas no distinguen entre mayúsculas y minúsculas o hacer que ArrayObject se pueda convertir en matriz sin perder la funcionalidad que la subclase implementa, o simplemente hacer que todas las funciones de matriz acepten instancias de ArrayObject.
Si extiende ArrayObject
o implementa ArrayAccess
, puede hacer lo que desee.