Endeksleri varolmayan için varsayılan değer ile PHP dizi

3 Cevap php

Ben bir varsayılan değere sahip Hash nesneyi başlatılamıyor Ruby Hash uygulanmasını seviyorum. Şu anda ben PHP benzer bir nesne uygulama ile mücadele ediyorum. Bu, benim ilk (çalışma dışı) vurulur.

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);

İkinci iddia başarısız olur. Kodu atlama offsetGet denir ve yan tümcesi yürütüldüğünde olduğunu gösterir. Yine de herhangi bir dizi değeri null. Alternatif uygulamalar için herhangi bir fikir?

Ben yazma yoruldum

if(!isset($myarr['value']))
    $myarr['value'] = new MyObj();
$myarr['value']->myVal=5;

yerine sadece yazma

$myarr['value']->myVal=5;

3 Cevap

$da->setDefault(1);

Ayrıca __ inşa sihirli işlevini kullanabilirsiniz:

class DefaultArray extends ArrayObject
{
    public function __construct($value = null){
        if(is_null($value))
        {
            $this->value = 'default';
        } else {
            $this->value = $value;
        }
    }
}

Neden bu kadar karmaşık?

function initVal($value) {
    global $myarr;
    if(!isset($myarr['value']))
        $myarr['value'] = new MyObj();
}

Şimdi sadece aramak zorunda:

initVal('bla');
$myarr['bla']->bla = 'bla';

Ama seninki daha temiz olduğunu görüyoruz.