我正在尝试创建一个带有参数的对象来加载函数,同时在其中使用缩短命名空间路径。它就像,
use Com\Core\Service\Impl as Impl;
class Load {
public static function service(String $class, array $params = array()){
try {
$ucfirstclass = ucfirst($class);
if (interface_exists('\\Com\\Core\\Service\\' . $ucfirstclass)) {
$ref = "Impl\\".$ucfirstclass;
return new $ref();
} else {
throw new Exception("Service with name $class not found");
}
} catch (\Throwable $ex) {
echo $ex->getMessage();
}
}
}
虽然称之为,
$userService = Load::service("user");
它正在抛出异常
Class 'Impl\User' not found
如果我只是替换" Impl"它会正常工作。在Load :: service()实现中使用完整路径" Com \ Core \ Service \ Impl"。
我对此很新。有人可以帮助我为什么不能使用缩短路径" Com \ Core \ Service \ Impl作为Impl" ?
答案 0 :(得分:2)
在其中使用缩短命名空间路径。
没有"短命名空间"。命名空间或类由其完整路径确定,从根命名空间开始。
use Com\Core\Service\Impl as Impl;
上面代码片段中的 Impl
是class or namespace alias。别名在编译时解析,并且仅在声明它的文件中有效。
在运行时期间无法使用别名。在运行时期间引用类名的唯一方法是生成其绝对路径(从根命名空间开始) 你已经发现了这个。
答案 1 :(得分:1)
当将类名称称为string
时,您始终必须使用完全限定的类名。
试试这个:
$ucfirstclass = ucfirst($class);
if (interface_exists('Com\\Core\\Service\\' . $ucfirstclass)) {
$ref = 'Com\\Core\\Service\\Impl\\' .$ucfirstclass;
return new $ref();
}
供参考,见: