所有名称都是有条件的。创建了 Animal 类,然后子类化了 Elephant、Bird 等。我从这里获取了类自动加载功能。
文件夹:
controller.php
classes
-core
--Animal.php (namespace core)
--Bird.php (namespace core)
--Elephant.php (namespace core)
-database
脚本配置
$codes = [
1 => 'Elephant',
2 => 'Bird'
];
在最初注册的控制器中
use \core\Bird as Bird;
use \core\Elephant as Elephant;
然后我尝试像这样实例化类
$code = 1; //поступает извне
$response = new $codes[$code]($params); // подразумеваю new Elephant()
自然给出Fatal error: Class 'Elephant' not found in D:\server\localhost\test\www\controller.php on line 42,没有看到命名空间。
原来use根本不用用,只需要手动生成带命名空间的类路径对不对?
$class = 'core\\' . $codes[$code];
$response = new $class($params);
关于这个http://php.net/manual/en/language.namespaces.dynamic.php的 php 文档
use是一个编译时语法糖。在脚本执行时,这些指令不再存在。因此,从字符串创建对象时,类名namespace必须是完全限定的。对于列入白名单的静态数组,以下条目可能有用:
魔法常量
::class会将指定的类名转换为字符串——带有命名空间的类的全名。这也是一个编译时操作,因此使用指令use并且不调用类自动加载机制。自 PHP 5.5 起可用。