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