ReflectionClassでメソッドを動的に呼ぶ&ベンチマーク
http://d.hatena.ne.jp/gom68/20090926/1253939933
あまり、記事内容に沿うリンクじゃありませんが、ReflectionClass を調査していてふと・・・。
$i = 0;
$o = new stdClass();
$o->$i = 'number';
echo $o->0; // !) Parse error
$o = new stdClass();
$o->$i = 'number';
echo $o->0; // !) Parse error
これは Parse error になりますが、以下なら。
$i = 0;
$o = new stdClass();
$o->$i = 'number';
echo $o->{0}; // number
$o = new stdClass();
$o->$i = 'number';
echo $o->{0}; // number
他にもこんな事も
$obj = new myclass;
class myclass{
function mymethod ($msg){echo $msg;}
}
function fn1(){return 'obj';}
function fn2(){return 'method';}
${fn1()}->{'my' . fn2()}('Hello!'); // Hello!
class myclass{
function mymethod ($msg){echo $msg;}
}
function fn1(){return 'obj';}
function fn2(){return 'method';}
${fn1()}->{'my' . fn2()}('Hello!'); // Hello!
$ や -> に続く { } には、色々と突っ込めたりする。
class myclass{
private $buffer = '';
function __construct($v){
return $this->name($v);
}
function name($v = false){
static $n;
if($v) $n = $v;
return $n;
}
function push($msg){
$this->buffer .= "$msg ";
return $this->name();
}
function flush(){
echo $this->buffer;
$this->buffer = '';
return $this->name();
}
}
$o = new myclass('o');
${${$o->push('Hello')}->push('world !')}->flush();
// Hello world !
private $buffer = '';
function __construct($v){
return $this->name($v);
}
function name($v = false){
static $n;
if($v) $n = $v;
return $n;
}
function push($msg){
$this->buffer .= "$msg ";
return $this->name();
}
function flush(){
echo $this->buffer;
$this->buffer = '';
return $this->name();
}
}
$o = new myclass('o');
${${$o->push('Hello')}->push('world !')}->flush();
// Hello world !
読み手を混乱させるためだけのトチ狂った^^;ことも
変数名要求するなんて・・・、抽象化なんて知った事か!ってなコードです(w)
この記事へのコメント