提问人:Dennis 提问时间:9/27/2016 更新时间:9/27/2016 访问量:106
在 php 中动态创建类
Dynamic class creation in php
问:
我试图通过实例化一个类在一行中做一些 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:我想立即使用字符串返回值来实例化一个类。
答:
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 如何进行反射。谢谢!
评论