在 php 中动态创建类

Dynamic class creation in php

提问人:Dennis 提问时间:9/27/2016 更新时间:9/27/2016 访问量:106

问:

我试图通过实例化一个类在一行中做一些 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:我想立即使用字符串返回值来实例化一个类。

php 变量

评论


答:

0赞 Mihai Matei 9/27/2016 #1

虽然我不推荐这样的代码,因为它真的很难遵循和理解,但你可以使用 来完成它: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();

评论

1赞 Dennis 9/27/2016
伟大!我同意它不是可读性最强的代码,这是一个合理的担忧,但在理解反射方面它非常简单。它也是一个狭窄的用例(基本上是一段隐藏得很好的代码,它围绕特定库进行一些类实例化,以使该库的使用更加干净)。它像野兽一样被评论并且正在工作 - 我也学会了 php 如何进行反射。谢谢!