ここではphpが上から下に実行されると仮定していますが、そのようにはうまくいきません:
<?php
foo(); # works
function foo(){
print "bar";
}
<?php
foo(); #dies
if( $i == 1 )
{
function foo(){
print "bar";
}
}
<?php
$i = 1;
if( $i == 1 )
{
function foo(){
print "bar";
}
}
foo(); #works
現在、条件付きでクラスを作成できますが:
<?php
class A { }
class B { }
if( false ){
class C extends B {
public static function bar(){
print "baz";
}
}
}
C::bar(); # dies
実行時に変数からインスタンス化することはできません。
<?php
class A { }
class B { }
$x = 'B';
if( false ){
class C extends $x {
public static function bar(){
print "baz";
}
}
}
C::bar();
---> Parse error: syntax error, unexpected T_VARIABLE, expecting T_STRING in /tmp/eg.php on line 7
Eval でそれを行う方法がありますが、実際にはそこに行きたくありません。
<?php
class A { }
class B { }
$x = 'B';
if( true ){
$code =<<<EOF
class C extends $x {
public static function bar(){
print "baz";
}
}
EOF;
eval( $code );
}
C::bar();
$o = new C;
if ( $o instanceof $x )
{
print "WIN!\n";
}
--->barWIN!
ただし、ここでさらに重要な問題があります。
なぜ実行時に別のクラスを拡張したいのですか
あなたのコードを使用している人は誰でも、あなたを押さえつけたいと思うでしょう。
(または、鞭打ちに興味がある場合は、その eval トリックを実行してください)