php中的动态类创建

时间:2016-09-27 07:50:51

标签: php variable-variables

我试图通过实例化一个类在一行中做一些php魔术,但似乎解析器不允许我。例如:

class Test{
    private $foo;
    public function __construct($value){ 
        $this->foo = $value;
    }

    public function Bar(){ echo $this->foo; }
}

显然可以这样调用:

$c = new Test("Some text");
$c->Bar(); // "Some text"

现在我想通过一些有趣的字符串操作来实例化它:

$string = "Something_Test";
$s = current(array_slice(explode('_', $string), 1 ,1)); // This gives me $s = "Test";

现在我可以使用:

来实例化它
$c = new $s("Some test text");
$c->Bar(); // "Someme test text"

但是,我很好奇为什么我不能单行(或者如果有一种聪明的方式),这样就可以了:

$c = new $current(array_slice(explode('_', $string), 1 ,1))("Some test text"); //Doesn't work

我也尝试过使用变量变量:

$c = new $$current(array_slice(explode('_', $string), 1 ,1))("Some test text"); //Doesn't work

我试图将其封装在一些括号中。也无济于事。我知道用例可能看起来很奇怪,但是我开始工作并实际使用php中的一些动态类型魔法很有趣。

tl; dr:我想立即使用字符串返回值来实例化一个类。

1 个答案:

答案 0 :(得分:0)

虽然我不推荐这样的代码,因为它很难理解,但您可以使用ReflectionClass来完成它:

class Test {
    private $foo;
    public function __construct($value){ 
        $this->foo = $value;
    }

    public function Bar(){ echo $this->foo; }
}

$string = "Something_Test";
$c = (new ReflectionClass(current(array_slice(explode('_', $string), 1 ,1))))->newInstanceArgs(["Some test text"]);
$c->Bar();