我有以下内容:
if (class_exists($name::class)) {
return new $name();
}
类$ name将是另一个命名空间的一部分,这是一个工厂方法。
Php不喜欢这样并抛出错误:
Fatal error: Dynamic class names are not allowed in compile-time
我怎样才能解决这个问题?
答案 0 :(得分:1)
我记得前段时间(也许是一周)我在网上的某个地方,在关于MVC或设计模式(我认为)的演示文稿中听说过,这样的构造为“:: class”尚未在PHP中实现。但也许在PHP>我不确定。无论如何:你不需要使用“:: class”。 但是您需要将完全限定名称(FQN)传递给class_exists。所以它必须是一个FQN字符串。例如:
$classFQN = "\myNamespaceName\mySubNamespaceName1\mySubNamespaceName2\myClassName";
if (class_exists($classFQN)) {
return new $classFQN();
}
注意第一个“\”(反斜杠)。它将命名空间的类名称设置为FULLY限定名称。 请参阅http://www.php-fig.org/psr/psr-4/
上的“PSR-4:Autoloader”答案 1 :(得分:-1)
function getClassInGlobal($name){
if(isset($GLOBALS[$name])){
if(is_object($GLOBALS[$name])){
$obj = $GLOBALS[$name];
return new $obj();
}else{
return false;
};
}else{
return false;
};
};
$Files = getClassInGlobal('myFilesClass');
if($Files){
echo '<pre>';
print_r(get_class_methods($Files));
echo '</pre>';
};