C ++在PHP中使用命名空间?

时间:2012-11-10 18:49:20

标签: php namespaces

PHP是否有某种using namespace的C ++? (所以你不必在打电话之前写任何命名空间)

我在:

中定义了一个函数
namespace \Project\Library {
   function hello() {

    }

}

另一个file.php:

use \Project\Library;

hello();     //> Error: Call to undefined function hello()

PS。

我知道我可以使用use \Project\Library as L;

然后执行L\hello();

我也想避免L\

修改

我回答自己:你不能这样做。这非常糟糕(这是我不喜欢PHP的第一件事)。

EDIT2

要明确:如果hello()是一个类,我可以使用use直接调用它。问题是这是一个简单的函数,所以我必须编写它的命名空间。这是PHP的一点点烦恼。

也许我们可以认为这是一个错误并打开一张票?

2 个答案:

答案 0 :(得分:2)

自PHP 5.3.0起,它支持语法use ... as

use My\Full\Classname as Another

也不能直接使用use手动猜测(没有as Another)(手册中没有提到)。

您可以通过自动加载器使用类工厂或解决方法之类的黑客,但简单直接的回答是“它不可能”。 :(

答案 1 :(得分:1)

即使PHP具有名称空间并且可以直接在类之外声明函数,我强烈建议您至少使用静态类方法。然后你不必破解周围的东西,并将使用命名空间,因为它们被设计为工作;与课程。

这是一个有效的例子:

<强> hello.php

<?php

namespace Project\B;

class HelloClass {
    static function hello() {
        echo "Hello from hello.php!";
    }
}

<强> a.php只会

<?php

namespace Project\A;

require('hello.php');  // still have to require the file, unless you have an autoloader

use \Project\B\HelloClass;   // import this class from this namespace

\Project\B\HelloClass::hello();   // calling it this way render the 'use' keyword obsolete

HelloClass::hello();  // or use it as it is declared

** 注意 **:use foo as bar;让您重命名该课程!例如:

use \Project\B\HelloClass as Foo;   // import this class from this namespace as Foo

Foo::hello();   // calling it this way using the 'use' keyword and alias

**更新**

有趣的是,你可以这样做:

<强> c.php

namespace Project\C;


function test() {
    echo "Hello from test!\n";
}

<强> a.php只会

use \Project\C;             // import namespace only
use \Project\C as Bar;      // or rename it into a different local one

C\test();        // works
Bar\test();      // works too!

所以,只需撰写use Project\Library as L;并致电L\hello();即可。我认为这是你最好的选择。