Php 在一行中从变量名和命名空间启动实例

Php 在一行中从变量名和命名空间启动实例,php,Php,有可能在一行中这样做吗 $map_class_name = __NAMESPACE__.'\\'.$map_class_name; $map = new $map_class_name; 以上给出 语法错误,意外的“(” 答案是否定的,不能将new与字符串或表达式一起使用 但是你可以用 $map = new (__NAMESPACE__.'\\'.$map_class_name); 由于您使用来自当前名称空间的类(\uuuuuu名称空间\uuuuuu),所以不必在classname前面加前缀

有可能在一行中这样做吗

$map_class_name = __NAMESPACE__.'\\'.$map_class_name;
$map = new $map_class_name;
以上给出

语法错误,意外的“(”


答案是否定的,不能将
new
与字符串或表达式一起使用

但是你可以用

$map = new (__NAMESPACE__.'\\'.$map_class_name);
由于您使用来自当前名称空间的类(
\uuuuuu名称空间\uuuuuu
),所以不必在classname前面加前缀,将隐含名称空间

替代解决方案 你可以使用反射

$map = new $map_class_name;
另一种方法是不要越界,但我想这没有抓住重点

$map = (new \ReflectionClass(__NAMESPACE__."\\$map_class_name"))->newInstance();
生命也是可能的

$map_class_name = __NAMESPACE__.'\\'.$map_class_name; $map = new $map_class_name;

为什么要在一行中写这篇文章?在两行中写这篇文章更具可读性。我不会把它作为答案发表,因为我不想因为使用了
eval()
,但是有
eval(“$class=new”。“$map\u class\u name()”)
@PatrickQ
eval()
易受远程代码注入攻击。@FabianPicone我知道。这就是为什么我没有把它作为答案发出去。@PatrickQ所以请不要建议破坏安全的东西;-)。反射的性能较差。另一个是在实践中工作的,但不是那么可读。@FabianPicone yeap,但由于无法将表达式与new一起使用,我开始搜索变通方法:)我刚刚意识到,您不需要添加
\uuuuuu名称空间\uuuuu
,因为您在这个名称空间中;隧道视觉我希望我有像你一样的研究时间,隧道视觉对我也是如此;-)
$map = (function($n){return new $n;})(__NAMESPACE__."\\$map_class_name");