以下のようにすれば、クラスを定義した後でも、インスタンス変数にアクセスするメソッド(のようなもの)を動的に生成できる。
無名関数のスコープが生成時のスコープに依存しないため、引数に&$thisを与えるのがポイント。
class Foo {
var $str;
function setStr($str) { $this->str = $str; }
function doAnonFunc($argsdef, $code, $arg) {
$func = create_function($argsdef, $code);
return $func(&$this, $arg);
}
}
$obj = new Foo;
$obj->setStr('baz');
echo 'STEP0:'.$obj->str."\n";
echo 'STEP1:'.$obj->doAnonFunc('&$this, $str', '$this->setStr($str); return $this->str;', 'test')."\n";
echo 'STEP2:'.$obj->str."\n";
出力:
STEP0:baz STEP1:test STEP2:test

