PHPのオーバーロードで動的にメソッドやメンバーを作成する

宣言していないメンバーやメソッドにアクセスしようとすると、マジックメソッドが呼ばれる。
そのマジックメソッドの中でごにょごにょしてあげれば良い。


それを使うと、メソッドチェインみたいなこともできる。

<?php
class Child {
}

class Hoge {
  private $values = array();
  public function __get($name) {
    if (isset($this->values[$name]) === false) {
      $this->values[$name] = new Child();
    }
    return $this->values[$name];
  }
}

$hoge = new Hoge();
$hoge->foo->bar = 'baz';

print_r($hoge);

/*
Hoge Object
(
    [values:private] => Array
        (
            [foo] => Child Object
                (
                    [bar] => baz
                )

        )

)
*/

Cakeのアソシエイト辺りは、こういうのを駆使してるのかなー?