【发布时间】:2021-08-11 17:33:28
【问题描述】:
我有大约 20 个不同的类,它们被隔离在一个类似于这样的关联数组中:
class a {public $val = 1;}
class b {public $val = 2;}
$classes = array("one"=>'a', "two"=>'b');
var_dump(new $classes["one"]()); // object(a)#1 (1) { ["val"]=> int(1) }
var_dump(new $classes["two"]()); // object(b)#1 (1) { ["val"]=> int(2) }
但现在我想做数组常量。
我可以使用const VAL = array(); 来实现它。
问题在于使用这些类制作新对象
class a {public $val=1;}
class b {public $val=2;}
const CLASSES = array("one"=>'a', "two"=>'b');
var_dump(new CLASSES["one"]());
因Parse error: syntax error, unexpected '[', expecting ')' 错误而失败。
我想我可以再次将 const 数组反转为变量,它工作正常:
class a {public $var = 1;}
class b {public $var = 2;}
const CLASSES = array("one"=>'a', "two"=>'b');
$tempClasses = CLASSES;
var_dump(new $tempClasses["one"]()); // works
但为什么它不适用于常量数组?
我也尝试使用括号和constant()。 new (CLASSES)["one"]()、new (CLASSES["one"])()、new constant(CLASSES)["one"]() 和 new constant(CLASSES["one"])() 都不起作用。
我有什么遗漏吗?
【问题讨论】:
-
new (CLASSES["one"])()适用于 PHP 8+。演示:3v4l.org/BUJ8H。否则,您可以在所有版本中使用$one = CLASSES['one']; new $one();。演示:3v4l.org/89PP3 -
所以之前没有实施过......这很糟糕。
-
我不知道你到底在做什么,但你的代码看起来像一个枚举路径,它是 coming in 8.1,并且使用许多库,包括 this
-
如果你不走枚举路径,这感觉就像一般工厂模式决定