PHP是否有某种using namespace
的C ++? (所以你不必在打电话之前写任何命名空间)
我在:
中定义了一个函数namespace \Project\Library {
function hello() {
}
}
另一个file.php:
use \Project\Library;
hello(); //> Error: Call to undefined function hello()
我知道我可以使用use \Project\Library as L;
然后执行L\hello();
我也想避免L\
。
我回答自己:你不能这样做。这非常糟糕(这是我不喜欢PHP的第一件事)。
要明确:如果hello()
是一个类,我可以使用use
直接调用它。问题是这是一个简单的函数,所以我必须编写它的命名空间。这是PHP的一点点烦恼。
也许我们可以认为这是一个错误并打开一张票?
答案 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();
即可。我认为这是你最好的选择。