我很困惑为什么变量类名似乎忽略了当前的名称空间?
我希望以下内容相同
<?php
namespace so\level1{
class test{
function __construct() {
echo "working correctly\r\n";
}
}
}
namespace so {
$a = new level1\test();
$b = 'level1\\test';
$c = new $b();
}
相反,$c
是新\level1\test
而不是\so\level1\test
这似乎与http://php.net/manual/en/language.namespaces.fallback.php
相矛盾类名始终解析为当前名称空间名称
http://php.net/manual/en/language.namespaces.rules.php
说
在命名空间内,所有未根据的属性转换的限定名称 导入规则具有前置的当前名称空间。例如,如果是 调用C \ D \ e()是在命名空间A \ B中执行的,它被转换为 A \ B \ C \ d \ E()。
我没有导入规则,因此它似乎也建议$a
和$c
相同
我缺少哪些文件?或者行为是错的?
以上输出
working correctly
PHP Fatal error: Class 'level1\test' not found in /tmp/namespace.php on line 15
PHP Stack trace:
PHP 1. {main}() /tmp/namespace.php:0
使用PHP 5.5.9和5.5.21
添加
namespace level1 {
class test{
function __construct() {
echo "Not working correctly\r\n";
}
}
}
使第二个名称空间解析,但似乎是不正确的行为
要确认,由于以下
,这似乎不正确<?php
namespace so {
$test = "namespace";
$var = "test";
echo $$var;
}
这可以正确解决问题&#34;但与上述内容不一致。
虽然call_user_func的行为方式与类
类似namespace so {
function testing() {
echo "in namespace";
}
call_user_func(__NAMESPACE__ . "\\testing");
}
在最后一种情况下,它实际上是记录在案的。使用变量函数的行为方式相同
答案 0 :(得分:3)
答案是,它不起作用,因为如果你开始使用动态类名称&#34;当前命名空间&#34;是全局命名空间。
但它似乎是不正确的行为,没有,正如我所说,如果你使用动态类名称&#34;当前命名空间&#34;是全球性的,而不是它所写的那个。
但有一点,你是对的。这在手册中没有明确说明。
那么现在该如何解决?您可以使用魔术常量__NAMESPACE__
来获取当前命名空间,您只需执行此操作:
namespace so\level1{
class test{
function __construct() {
echo "working correctly\r\n";
}
}
}
namespace so {
$a = new level1\test();
$b = __NAMESPACE__ . '\\level1\\test';
$c = new $b();
}
输出:
working correctly working correctly