是否可以在用作函数名之前评估表达式?

时间:2017-01-09 23:49:22

标签: php class variables object dynamic

我遇到了一个有简单解决方案的问题......

$this->controller = new "controllers\\" . $namespace . $controller($this->relativePath);

我想做类似上面的事情,但它不起作用,因为在评估 $controller($this->relativePath)之后似乎评估了连接字符串的值

解决方案是这样的......

$x = "controllers\\" . $namespace . $controller
$this->controller = new $x($this->relativePath);

但它让我有一个单用变量。还有其他选择吗?

2 个答案:

答案 0 :(得分:1)

您可以告诉PHP引擎评估字符串并使用eval()执行它...大多数解释语言都有这样的功能。我必须警告你,如果你的代码不完全正确,这可能会非常危险,因为PHP引擎无法确定你正在评估的是正确的PHP代码。因此,当您使用引擎时,您将失去一些安全性。但如果你知道自己在做什么,这不应该阻止你使用它;它是出于这个目的。

$this->controller = eval("new controllers\\" . $namespace . $controller($this->relativePath));

如果评估顺序错误,请使用括号表达您的意图;他们有最高的优先权。

Eval Documentation

我的个人推荐

使用Strategy Design Pattern

答案 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相反),这个可以提供安全利益。 您还可以扩展该功能以将其限制为某些名称空间等。