で、PHP5.3のクロージャー(無名関数)と__callを使って、
メソードを上書きできる、ように見せることが出来ました。
◆まぁ、こんな感じ。
echo 'test closure' . '
';
class test
{
var $name;
// +------------------------------------------+
function __construct() {
$self = $this;
$this->name = 'my test';
$this->getName = function() use( $self ) {
echo $self->name . '<br />';
};
}
// +------------------------------------------+
public function __call( $name, $args ) {
if( is_callable( $this->$name ) ) {
call_user_func_array( $this->$name, $args );
}
}
// +------------------------------------------+
}
$t = new test();
$t->getName(); // works.
$t->name = 'new test';
$t->getName(); // works fine.
// kind of overwriting method...
$t->getName = function() use( $t ) {
echo 'new: ' . $t->name . '
';
};
$t->getName(); // works great!
自宅のローカルPCでは動いてます。出力は、
test closure my test new test new: new test
となって、ほぼ想定どおりの動きです。
クロージャーを作るときにuseを使って、クラス自身を受け渡すこと、クラス内の変数にクロージャーを渡して、__callでオーバーライドするのがポイント。
$selfとかjavaScriptっぽくて、妙ですね。
実際使うかといわれると・・・
う~ん、
0 件のコメント:
コメントを投稿