Uwielbiam implementację Ruby w języku Ruby, w której można zainicjować obiekt Hash z wartością domyślną. W tej chwili zmagam się z implementacją podobnego obiektu w PHP. To jest mój pierwszy (niepracujący) strzał.Tablica PHP z domyślną wartością dla nieistniejących indeksów
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);
Drugie asercja nie powiedzie się. Krok po kroku pokazuje, że offsetGet jest wywoływane, a klauzula if jest wykonywana. Niemniej jednak dowolna wartość tablicy ma wartość NULL. Wszelkie pomysły na alternatywne wdrożenia?
Jestem zmęczony pisania
if(!isset($myarr['value']))
$myarr['value'] = new MyObj();
$myarr['value']->myVal=5;
zamiast tylko pisanie
$myarr['value']->myVal=5;
Podczas uzyskiwania dostępu do klucza, który nie istnieje, 'offsetGet' będzie ustaw ten klucz na wartość domyślną (patrz "offsetSet"). Oznacza to, że następnym razem będzie istnieć. Jeśli nie chcesz tego zachowania i zawsze otrzymujesz aktualną wartość domyślną dla nieistniejących kluczy, usuń wywołanie 'offsetSet'. – Gumbo
Dzięki, Gumbo za ważne wyjaśnienie, to zachowanie wprawiło mnie w zakłopotanie podczas pierwszego testu, ale jest zamierzonym zachowaniem. W odpowiedzi na pytanie, na które odpowiedział, zostawiam wadliwy kod testowy w niezmienionym stanie. – chiborg