我试图通过实例化一个类在一行中做一些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 :(得分: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();