PHP中的变量类扩展 - 是否可能?

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)

但是,这里有一个更重要的问题:

你为什么在运行时扩展另一个类?

任何使用你的代码的人都会想要阻止你并鞭打你.

(或者,如果你正在鞭打,做那个评估技巧)

  • 在一个理想的世界里,人们不会想要这样做.但这不是一个理想的世界.我查了一下,因为我坚持使用Joomla更改父类来定义版本1.5.x和更高版本之间的新"元素".我的子类不需要不同,我不想要不同的代码库,所以我希望能够根据Joomla的版本继承不同的类.这就是为什么. (2认同)