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

时间:2018-07-20 12:37:04

标签: php

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

是否可以像这样一行完成?

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

上面给出了

  

语法错误,意外的'('

1 个答案:

答案 0 :(得分:3)

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

但是您可以使用

$map = new $map_class_name;

由于您使用的是当前命名空间(__NAMESPACE__)中的类,因此不必在类名前面添加前缀,因此将隐含命名空间。

替代解决方案

您可以使用Reflection

$map = (new \ReflectionClass(__NAMESPACE__."\\$map_class_name"))->newInstance();

另一种方法是不中断行,但是我想这很重要。

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

IIFE也可以

$map = (function($n){return new $n;})(__NAMESPACE__."\\$map_class_name");