我遇到了一个有简单解决方案的问题......
$this->controller = new "controllers\\" . $namespace . $controller($this->relativePath);
我想做类似上面的事情,但它不起作用,因为在评估 $controller($this->relativePath)
之后似乎评估了连接字符串的值。
解决方案是这样的......
$x = "controllers\\" . $namespace . $controller
$this->controller = new $x($this->relativePath);
但它让我有一个单用变量。还有其他选择吗?
答案 0 :(得分:1)
您可以告诉PHP引擎评估字符串并使用eval()
执行它...大多数解释语言都有这样的功能。我必须警告你,如果你的代码不完全正确,这可能会非常危险,因为PHP引擎无法确定你正在评估的是正确的PHP代码。因此,当您使用引擎时,您将失去一些安全性。但如果你知道自己在做什么,这不应该阻止你使用它;它是出于这个目的。
$this->controller = eval("new controllers\\" . $namespace . $controller($this->relativePath));
如果评估顺序错误,请使用括号表达您的意图;他们有最高的优先权。
我的个人推荐
答案 1 :(得分:1)
如果您肯定不想使用第二个变量,您可以使用反射:
<?php
function createObject($name, $params = null) {
if($params == null) {
return (new ReflectionClass($name))->newInstance();
} else {
return (new ReflectionClass($name))->newInstanceArgs($params);
}
}
$instance = createObject("your"."classname", ["parameters"]);
可以测试它如何阻止性能eval
,但由于这只能实例化对象(与可以任意执行代码的eval相反),这个可以提供安全利益。
您还可以扩展该功能以将其限制为某些名称空间等。