PHP:如何使用::而不是\来访问命名空间类?

时间:2012-04-20 20:18:46

标签: php oop namespaces php-5.3 spl-autoload-register

我将namespace用于下面的类,

class_tidy.php,

namespace foo;

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

的index.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   或'$'......

3 个答案:

答案 0 :(得分:5)

你做不到。 PHP语法使用\作为名称空间。

事实上,php只使用T_PAAMAYIM_NEKUDOTAYIM(这是双冒号的名称),在类名之后使用它来指定你想要该类的成员。

我确实在这方面有一些模糊的细节阻止PHP将它用作命名空间编写器,但我不知道哪个。 (问题是,这意味着即使你从官方的php分支并制作了自己的版本,你也必须经历大量工作才能获得你想要的轻微语法更改。)

答案 1 :(得分:1)

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

答案 2 :(得分:1)

阅读官方手册:http://php.net/language.namespaces.nested 不支持::作为命名空间分隔符,因为它已经被使用(因此保留为scope resolution operator

Foo::$bar;

同样有趣:相应的RFC https://wiki.php.net/rfc/namespaceseparator