2

namespace在下面这样的课程中使用,

class_tidy.php,

namespace foo;

class tidy {
    public function hello() {
        echo 'Hello';
    }
}

索引.php,

class MyAutoloader
{
    public static function load($className)
    {
        $parts = explode('\\', $className);
        require 'classes/class_'.end($parts) . '.php';
    }
}

spl_autoload_register("\MyAutoloader::load");

$test = new foo\tidy();
$test->hello();

它工作得很好,但我想知道我是否可以访问该课程,而不是,

$test = new foo\tidy();

但,

$test = new foo::tidy(); 

哪个看起来更漂亮。但有了这个错误,

解析错误:语法错误,意外的 T_STRING,期待 T_VARIABLE 或 '$' ...

4

3 回答 3

5

你不能。PHP 语法\用于命名空间。

事实上,php 使用 T_PAAMAYIM_NEKUDOTAYIM(这是他们的双冒号名称)仅用于一件事,在类名之后使用它来指定您想要该类的成员。

我确实相信它的工作方式有一些晦涩的细节,这也阻止了 PHP 将其用作命名空间分隔符,但我不知道是哪一个。(问题是,这意味着即使您从官方 php 分支并制作了自己的版本,您也必须进行大量工作才能获得所需的细微语法更改。)

于 2012-04-20T20:25:18.847 回答
1

php 团队选择 \ 作为命名空间分隔符。即使您认为 :: 更好,您也无法更改它。我可以问你为什么会这样吗?

于 2012-04-20T20:25:45.623 回答
1

阅读官方手册:http :: ://php.net/language.namespaces.nested不支持作为命名空间分隔符,因为它已经被用作(因此被保留)作为范围解析运算符

Foo::$bar;

也很有趣:相应的 RFC https://wiki.php.net/rfc/namespaceseparator

于 2012-04-20T20:28:44.993 回答