3

次のレジストリ クラスがあるとします。

Class registry 
{
    private $_vars;

    public function __construct()
    {
        $this->_vars = array();
    }

    public function __set($key, $val)
    {
        $this->_vars[$key] = $val;
    }

    public function __get($key)
    {
        if (isset($this->_vars[$key]))
            return $this->_vars[$key];
    }

    public function printAll()
    {
        print "<pre>".print_r($this->_vars,true)."</pre>";
    }
}

$reg = new registry();

$reg->arr = array(1,2,3);
$reg->arr = array_merge($reg->arr,array(4));

$reg->printAll();

新しいアイテムを「arr」配列にプッシュする簡単な方法はありますか? このコード: 'array[] = item' はマジック セット メソッドでは機能せず、Google で有用な情報を見つけることができませんでした。御時間ありがとうございます!

4

2 に答える 2

4

あなたが持っている場合:

$reg = new registry();
$reg->arr = array(1,2,3);
$reg->arr = 4;

そして、あなたは期待しています:

Array
(
    [arr] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
            [3] => 4
        )

)

__setメソッドを次のように更新するだけです。

public function __set($key, $val){
  if(!array_key_exists($key, $this->_vars)){
    $this->_vars[$key] = array();
  }
  $this->_vars[$key] = array_merge($this->_vars[$key], (array)$val);
}
于 2010-04-13T18:30:09.617 に答える
3

参照によって返されるように __get() の定義を変更する必要があります。

public function &__get($key) {
  return $this->_vars[$key];
}
于 2012-01-28T22:08:46.600 に答える