Dar*_*ein 5 php class object variable-variables
在PHP中可能会出现以下内容吗?
$blah = 'foo1';
class foo2 extends $blah {
//...
}
class foo1 {
//...
}
Run Code Online (Sandbox Code Playgroud)
这给出了一个错误.
我想动态设置$ blah所以我可以扩展我想要的任何类.
编辑:想要这样做的原因是因为我想在相关类中使用另一个类的函数.最后它会是这样的:
Final extends foo1 extends foo2 extends foo3 extends foo4 extends parent { ... }
Run Code Online (Sandbox Code Playgroud)
最后,我决定在类中实例化另一个类并使用它.不是最好的选择,因为它们都是你们两个相同的类,但是这些不会经常使用,因此它现在可以使用.
Ken*_*ric 15
你假设这里php从上到下执行,但它不是那样的工作:
<?php
foo(); # works
function foo(){
print "bar";
}
Run Code Online (Sandbox Code Playgroud)
<?php
foo(); #dies
if( $i == 1 )
{
function foo(){
print "bar";
}
}
Run Code Online (Sandbox Code Playgroud)
<?php
$i = 1;
if( $i == 1 )
{
function foo(){
print "bar";
}
}
foo(); #works
Run Code Online (Sandbox Code Playgroud)
现在,虽然您可以有条件地创建类:
<?php
class A { }
class B { }
if( false ){
class C extends B {
public static function bar(){
print "baz";
}
}
}
C::bar(); # dies
Run Code Online (Sandbox Code Playgroud)
你不能在运行时从变量实例化一个:
<?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
Run Code Online (Sandbox Code Playgroud)
有一种方法可以用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!
Run Code Online (Sandbox Code Playgroud)
但是,这里有一个更重要的问题:
你为什么要在运行时扩展另一个类?
任何使用你的代码的人都会想要阻止你并鞭打你.
(或者,如果你正在鞭打,做那个评估技巧)