Me encanta la implementación de Hash de Ruby, donde puede inicializar el objeto Hash con un valor predeterminado. Por el momento estoy luchando con la implementación de un objeto similar en PHP. Esta es mi primera oportunidad (no laboral) de esto.Matriz PHP con valor predeterminado para índices no existentes
class DefaultArray extends ArrayObject {
protected $_defaultValue;
public function setDefault($defaultValue) {
$this->_defaultValue = $defaultValue;
}
public function offsetExists($index) {
return true;
}
public function offsetGet($index) {
if(!parent::offsetExists($index)) {
if(is_object($this->_defaultValue))
$default = clone $this->_defaultValue;
else
$default = $this->_defaultValue;
parent::offsetSet($index, $default);
}
return parent::offsetGet($index);
}
}
$da = new DefaultArray();
assert($da["dummy"] == null);
$da->setDefault = 1;
assert($da["dummy2"] == 1);
La segunda afirmación fallará. Al recorrer el código, se muestra que se llama a offsetGet y se ejecuta la cláusula if. Sin embargo, cualquier valor de matriz es nulo. ¿Alguna idea para implementaciones alternativas?
estoy cansado de escribir
if(!isset($myarr['value']))
$myarr['value'] = new MyObj();
$myarr['value']->myVal=5;
en lugar de escribir
$myarr['value']->myVal=5;
Al tener acceso a una clave que no existe, 'offsetGet' se establecer esa clave con el valor predeterminado (ver 'offsetSet'). Eso significa que la próxima vez existirá. Si no desea ese comportamiento y siempre obtiene el valor predeterminado actual para las claves que no existen, elimine la llamada 'offsetSet'. – Gumbo
Gracias, Gumbo por la importante aclaración, este comportamiento me ha desconcertado en mi primera prueba, pero es el comportamiento previsto. La pregunta ahora está respondida y dejaré el código de prueba defectuoso tal como está. – chiborg