php命名空间,访问全局类

时间:2013-01-26 14:46:54

标签: php namespaces

从php文档中,我们访问全局类,如

<?php
namespace A\B\C;
class Exception extends \Exception {}
$a = new Exception('hi'); // $a is an object of class A\B\C\Exception
$b = new \Exception('hi'); // $b is an object of class Exception
$c = new ArrayObject; // fatal error, class A\B\C\ArrayObject not found
?> 

然而,当医生说

时,我很遗憾
<?php
$a = new \stdClass;
?>

在功能上等同于:

<?php
$a = new stdClass;
?>

此处http://php.net/manual/en/language.namespaces.faq.php#language.namespaces.faq.shouldicare

有人可以解释一下博士在这里说的话。

感谢。

2 个答案:

答案 0 :(得分:3)

正好在这两个代码示例in the docs之上是重要的标题:

  

如果我不使用名称空间,我应该关心这些吗?

     

没有。命名空间不会以任何方式影响任何现有代码,也不会影响任何尚未包含命名空间的尚未编写的代码。如果您愿意,可以编写此代码:

所以这里的含义并不是你可以在命名空间内编写new stdClass; 并让它等效,而是如果你根本不使用命名空间,那么你不必担心反斜杠new \stdClass;

在命名空间中工作时,规则确实适用,您需要使用new \stdClass;

这不仅适用于通用stdClass,而是适用于任何类。

// Without namespaces:
$mysqli = new MySQLi(...);

// With namespaces
$mysqli = new \MySQLi(...);

答案 1 :(得分:2)

文档说\stdClass功能上只相当于stdClass

  

尚未编写的代码,不包含名称空间

即。如果您正在使用名称空间 - 正如您的代码所示 - 您将在当前名称空间中定义该类(使用new stdClass);或者你只需​​要使用不需要一个(new \stdClass)的本机类。