Mi piace l'implementazione di Hash di Ruby in cui è possibile inizializzare l'oggetto Hash con un valore predefinito. Al momento sto lottando con l'implementazione di un oggetto simile in PHP. Questo è il mio primo sparo (non funzionante) a questo.Array PHP con valore predefinito per gli indici non esistenti
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 seconda affermazione fallirà. Passando attraverso il codice si mostra che viene chiamato offsetGet e viene eseguita la clausola if. Tuttavia, qualsiasi valore di matrice è nullo. Qualche idea per implementazioni alternative?
Sono stanco di scrivere
if(!isset($myarr['value']))
$myarr['value'] = new MyObj();
$myarr['value']->myVal=5;
invece di scrivere
$myarr['value']->myVal=5;
Quando si accede a una chiave che non esiste, 'offsetGet' sarà imposta quella chiave con il valore predefinito (vedi 'offsetSet'). Ciò significa che la prossima volta esisterà. Se non si desidera tale comportamento e si ottiene sempre il valore predefinito corrente per le chiavi non esistenti, rimuovere la chiamata 'offsetSet'. – Gumbo
Grazie, Gumbo per l'importante chiarimento, questo comportamento mi ha sconcertato nel mio primo test, ma è il comportamento previsto. La domanda in ora ha risposto e lascerò il codice di test difettoso così com'è. – chiborg