Вы предполагаете, что здесь 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!
Однако здесь есть более важный вопрос:
Какого черта вы хотите расширить другой класс во время выполнения
Любой, кто использует ваш код, захочет удержать вас и сбить вас за это.
(В качестве альтернативы, если вы увлекаетесь поркой, сделайте этот пробный трюк)