【发布时间】:2015-02-19 22:24:17
【问题描述】:
我很困惑为什么变量类名似乎忽略了当前的命名空间?
我希望以下内容相同
<?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;
}
这解决了“正确”但与上述不一致。
虽然 call_user_func 的行为方式与类类似
namespace so {
function testing() {
echo "in namespace";
}
call_user_func(__NAMESPACE__ . "\\testing");
}
在最后一种情况下,它实际上是记录在案的。使用变量函数的行为方式相同
【问题讨论】:
标签: php namespaces