Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中使用常量来保存类名来声明对象(就像使用变量一样)?_Php_Class_Object_Constants - Fatal编程技术网

在PHP中使用常量来保存类名来声明对象(就像使用变量一样)?

在PHP中使用常量来保存类名来声明对象(就像使用变量一样)?,php,class,object,constants,Php,Class,Object,Constants,这个问题是关于PHP中的语法/语法功能的。例如,在声明对象时使用变量存储类名: $className= 'myClass'; $obj = new $className; 我想知道是否有一些方法可以对常量进行同样的处理。大致如下: define('CLASS_NAME','myClass'); $obj = new {CLASS_NAME}; 这不管用。显然,我可以使用一个变量作为中间步骤,但出于启发的目的,我主要想知道这是否是一个格式问题,或者这是不是不可能直接以这种方式完成的。作为类名(

这个问题是关于PHP中的语法/语法功能的。例如,在声明对象时使用变量存储类名:

$className= 'myClass';
$obj = new $className;
我想知道是否有一些方法可以对常量进行同样的处理。大致如下:

define('CLASS_NAME','myClass');
$obj = new {CLASS_NAME};

这不管用。显然,我可以使用一个变量作为中间步骤,但出于启发的目的,我主要想知道这是否是一个格式问题,或者这是不是不可能直接以这种方式完成的。

作为类名(例如
MyClass
)无法与常量名
MyClass
区分-您的方法将无效。

在PHP中使用合理的表达式无法做到这一点,因为

你可以在一行中进行反射

$obj = (new ReflectionClass(CLASS_NAME))->newInstance();
任何参数都需要进入调用


这是一个愚蠢的想法,尤其是因为根据字符串中的类名使用变量行为可能意味着糟糕的体系结构。不要这样做。但是你问它是否可能,是的,它是。

在这种情况下,你不能用
new{CLASS_NAME}
创建一个对象。我主要是想知道常数是否可能,而不是实际使用它,但是你能备份不应该使用变量函数的语句吗?它简化了许多编码问题。您还打算如何将回调函数或匿名函数作为参数传递?@Thraciusappotite我说的是使用变量实例化类,而不是调用函数。它有一些有效的用例,但相对较少。示例用例:您有一个具有许多不同实现的接口,有时甚至所有实现都有相同的类名,其中每个实现都位于自己的版本化文件夹中,然后,您可以将所需的版本传递给工厂,工厂可以返回接口的实现。