5

我只是想知道是否有一种方法可以使用“use”关键字使一个类的行为就好像它在全局命名空间中一样,所以这个类只能从类外部表现为命名空间类。就像是:

namespace wherever\somewhere\deep\deep\inside;
use \; // root namespace.. note: this doesn't work
class stuff{
//....
}

任何人?

4

3 回答 3

19

使用全局命名空间不会按您期望的方式工作。

默认情况下,您可以通过添加反斜杠来引用全局命名空间类——例如$x = new \PDO(...);. 努力use \不会改变这一点。

如果要从全局命名空间的类中删除反斜杠,则需要use专门针对它们中的每一个。在命名空间 PHP 中,任何没有命名空间的类引用都被假定在当前命名空间中,除非它被声明显式引用use

例如:

use \PDO, \SplFileObject;

现在我们可以调用new PDO(...)new SplFileObject()不使用反斜杠。但是其他不在的全局类use仍然需要反斜杠。

于 2013-01-08T12:14:23.327 回答
3

如果您使用这样的括号,您可以访问全局命名空间:

namespace My\Space {
    function myScopedFunction() { .. }
}
namespace {
    function myGlobalFunction() { .. }
}
于 2017-06-29T10:39:03.530 回答
2

我不认为你可以。如果有人找到好的方法,请分享。我尝试了以下显然不起作用的方法(文章在这里http://www.siteconsortium.com/h/D0000H.php)。我会发现能够以这种方式进入根命名空间非常有用,因为许多遗留代码不使用命名空间。

$root = \_\_NAMESPACE\_\_;   // error 

namespace AA; 
function foo() { print " What AA "; }

use ($root);      // error

namespace $root;  // error can't use var

namespace ""; // error

use "/"; // error

namespace "/";   // error

这里有几个不同的问题。我觉得奇怪的一件事是我可以使用关键字require_once $script_name,但我不能使用关键字namespace $namespace_name

于 2014-01-09T00:43:15.717 回答