多个文件和命名空间作用域

5

我是一个新手,对命名空间并不熟悉(我已经阅读了 PHP 文档中的命名空间部分)。我想知道在多个文件中使用命名空间的范围是否有效。当我在一个有全局代码的文件中包含或需要那个文件时,命名空间是否跨越一个文件仍然有效?此外,这对全局代码有何影响?我是否需要针对全局代码进行语法方面的任何更改。

例如,假设我有文件 A.php。我想要能够做到这一点:

namespace A;
class Abc { ... }

假设我有一个全局代码文件,叫做main.php:

include("A.php");
class Abc { ... }
$abc = new Abc(); // Should be global Abc, right?
$abcFromNameSpace = new A\Abc(); // Should be namespace Abc, right?
...

作为一个后续问题,我也想知道如果我在另一个有命名空间的文件中包含一个带有命名空间的文件,会发生什么情况,而不是上面的例子,其中main.php仅具有全局代码。那样会像这样工作:
namespace A;
class Abc { ... }

假设我有一个包含全局代码的文件,叫做B.php:

namespace B;
include("A.php");
class Abc { ... }
$abc = new B\Abc(); // Should be namepsace B Abc, right?
$abcFromNameSpace = new A\Abc(); // Should be namespace A Abc, right?
1个回答

7

任何时候,当您引用当前文件或类范围之外的类时,都需要使用它的命名空间:

<?php
namespace B;

$class = new \A\Abc();

但是如果您在脚本中“使用”命名空间,您可以省略它:
<?php
namespace B;

use A\Abc;

$class = new Abc();

只是为了澄清,命名空间的范围是否仅限于文件?在全局示例(第一个示例)中,如果我在main.php中执行$class = new Abc();,那么我就是在引用全局类。如果我想引用命名空间A的Abc类,我必须执行$class = new \A\Abc(); 是这样吗? - J Johnson
1
如果你在文件顶部没有定义命名空间,类名将在全局范围内查找。否则Abc()只会在文件的命名空间中查找(除非你在前面加上反斜杠来表明全局命名空间)。 - Emery King
4
我明白了。尽管如此,对我来说有些奇怪的是,在一个文件被包含在另一个文件中时,命名空间的作用域不会超出定义它们的文件。我的意思是,所有其他代码都成为包含该行的文件的一部分。 - J Johnson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接