为什么PHP类必须限定为全局命名空间而函数不是?

时间:2014-11-23 06:14:25

标签: php namespaces

time()为什么InvalidArgumentException不需要限定为全局命名空间?

我怀疑论点是:必须限定每一个std lib函数都会过于繁琐,但同样的论点也可以应用于类。是否有任何技术原因需要合格?

作为一个例子

<?php namespace aname;
class Baz {
    function setBar($foo) {
        if ($foo < 0) {
            throw new \InvalidArgumentException("Some message");
        }
    }
    function setFoo($foo) {
        if ($foo < 0) {
            throw new InvalidArgumentException("Some message");
        }
    }
}
echo "here is the current timestamp: " . time() . PHP_EOL;
$baz = new Baz();
try {
    $baz->setBar(-1);   
} catch (\InvalidArgumentException $e) {
    echo $e->getMessage() . PHP_EOL;
}
$baz->setFoo(-1);

输出。

here is the current timestamp: 1416722687
Some message
PHP Fatal error:  Class 'aname\InvalidArgumentException' not found in /<long/path>/nstest.php on line 10

另外,为什么我运行此代码时不会出现解析错误?我的印象是namespaces resolution发生在PHP调用编译时。

  

根据当前的导入规则,在编译期间翻译所有不合格和限定名称(非完全限定名称)。例如,如果命名空间A \ B \ C作为C导入,则对C \ D \ e()的调用将转换为A \ B \ C \ D \ e()。

0 个答案:

没有答案