什么是命名空间?

什么是PHP命名空间?

什么是命名空间一般?

以一个例子来说,一个外行人的答案会很好。

命名空间为函数和类提供了variables的作用域。 它允许您在同一程序的不同部分使用相同的函数或类名,而不会导致名称冲突。

简而言之, 把名字空间想象成一个人的姓氏 。 如果有两个人叫“约翰”,你可以用他们的姓把他们分开。

情景

假设您编写一个使用名为output()的函数的应用程序。 您的output()函数将获取页面上的所有HTML代码并将其发送给用户。

稍后,您的应用程序变得更大,并且您想添加新的function。 您添加一个库,允许您生成RSS源。 该库还使用一个名为output()的函数来输出最终的提要。

在调用output() ,PHP如何知道是使用output()函数还是RSS库的output()函数? 它不。 除非你使用命名空间。

我们如何解决有两个output()函数? 简单。 我们把每个output()函数放在自己的名字空间中 。

这看起来像这样:

 namespace MyProject; function output() { # Output HTML page echo 'HTML!'; } namespace RSSLibrary; function output(){ # Output RSS feed echo 'RSS!'; } 

后来当我们想要使用不同的function时,我们使用:

 \MyProject\output(); \RSSLibrary\output(); 

或者我们可以声明我们在一个名字空间中,然后我们可以调用这个名字空间的output()

 namespace MyProject; output(); # Output HTML page \RSSLibrary\output(); 

没有命名空间?

如果我们没有命名空间,那么每当我们添加一个库时,我们都必须(可能)更改大量的代码,或者拿出冗长的前缀来使我们的函数名称唯一。 使用命名空间,我们可以避免在将第三方代码与我们自己的项目混合时发生命名冲突的麻烦。

命名空间允许你在一个名字下面放置一堆代码,并且不会和类,函数和常量有任何的命名冲突。

它允许你的代码在这个名字空间中。

PHP使用有点争议的字符 \来显示命名空间级别。 人们起来,因为它也被用来作为逃生angular色。

要在PHP中使用命名空间,请在文件的顶部使用类似这样的内容。

 namespace my\namespace; 

你可以在名字空间的官方PHP文档中find更多的信息。

在其他编程语言中有像名称空间这样的技术(比如Java中的包)。 他们习惯于能够在项目中使用同名的多重类。

从PHP文档( http://www.php.net/manual/en/language.namespaces.rationale.php ):

什么是命名空间? 在最广泛的定义中,命名空间是封装项目的一种方式。 这在许多地方可以被看作是一个抽象的概念。 例如,在任何操作系统目录中,用于对相关文件进行分组,并充当其中文件的命名空间。 作为一个具体的例子,文件foo.txt可以存在于目录/ home / greg和/ home / other中,但是foo.txt的两个副本不能共存在同一个目录中。 此外,要访问/ home / greg目录之外的foo.txt文件,我们必须使用目录分隔符将目录名添加到文件名中以获取/home/greg/foo.txt。 这个原则延伸到编程世界的命名空间。

名字空间基本上可以让你把代码放入一个容器中。 这将防止共享相同名称的两个函数(以及类和variables)的问题。

当大型应用程序工作时,这些function非常有用,可以防止代码段共享相同的名称。

例如,可以说我们需要两个称为“TheMessage”的函数。 这两者都会打印(回显)不同的消息。 通常情况下,这会导致语法错误,因为不能有两个共享相同名称的函数。

要解决这个问题,你可以把这些函数放到不同的名字空间中。 这将允许您使用这两个函数没有任何错误。

名字空间就像一个目录。 您知道如何将文件放在父目录(或任何其他目录)中与文件名称相同的目录中? 那么,命名空间可以让你在variables,函数和类的应用程序中执行这个命令。

很久以前,PHP在大量的静态函数中出现了一些趋势。 调用这些函数的唯一方法是用类名前缀一个调用。 这是对命名空间的一种原始尝试,但没有太多好处。

就像目录文件一样 ,PHP中的命名空间用于对函数接口常量进行分组。

例:

 Filesystem | PHP Namespace ----------------|------------------ /Dir/File.txt | \Namespace\Class 

它提供了一种从全局空间中包装项目的方法,并允许使用简单的项目名称,而不会在程序中引起名称冲突。 它支持PHP 5.3.0,PHP 7。

但是在PHP命名空间和基于Unix的文件系统之间有类似的限制:

  | Filesystem | PHP Namespace --------------------------|-----------------------|------------------------- Cas sensitive | No | Yes --------------------------|-----------------------|------------------------- Name with plain number | Yes | No --------------------------|-----------------------|------------------------- Path level | Yes | Yes --------------------------|-----------------------|------------------------- Plain metacharacters name | Yes | No 

原则扩展到编程语言中的命名空间。