什么是名称空间?


241

什么是PHP命名空间?

一般而言,命名空间是什么?

一个有例子的Layman答案会很棒。

Answers:


573

Namespacing对函数和类起作用,而作用域对变量起作用。它使您可以在同一程序的不同部分中使用相同的函数或类名,而不会引起名称冲突。

简单来说,将名称空间视为一个人的姓氏。如果有两个人名为“ John”,则可以使用他们的姓氏来区分他们。

场景

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

稍后,您的应用程序会变大,您想添加新功能。您添加一个库,使您可以生成RSS feed。该库还使用一个名为的函数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!';
}

稍后,当我们想使用不同的功能时,我们将使用:

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

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

namespace MyProject;

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

没有命名空间?

如果没有命名空间,则每次添加库时(潜在)都要更改很多代码,或者想出乏味的前缀来使函数名唯一。使用名称空间,当将第三方代码与我们自己的项目混合时,我们可以避免命名冲突的麻烦。


出于某种原因,我认为,如果您在file1中使用了名称空间,则无需在file2中包含该文件。单元测试表明情况并非如此。
亚伦·贝尔

1
@AaronBell您可能想检查一下自动加载功能
cbednarski

21

命名空间使您可以在名称下放置一堆代码,并且与类,函数和常量没有任何命名冲突。

它可以让你的代码,以居住在该命名空间。

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

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

namespace my\namespace;

您可以在有关名称空间官方PHP文档中找到更多信息。


11

由于通过了解“名称空间”更容易了解关键字“使用”,因此,让我先通过看一个基本的Laravel项目来解释名称空间。

有一个名为控制器类:Controller.php这样这是在路径: 应用程序/ HTTP /控制器从项目的根目录下还有另一个名为控制器类:Controller.php这样,但是这一次是在路径: 供应商/ laravel / framework / src / Illuminate /项目根目录中的路由

如果您是php的新手,则无需查看源代码,因为它会使您感到困惑,而让我向您解释我们关心的部分,它将帮助我们理解“命名空间”和“使用”。 ”。

因此,事实上,我们的第一个控制器类: app / Http / Controllers / Controller.php需要使用第二个控制器类vendor / laravel / framework / src / Illuminate / Routing / Controller.php。它实际上需要扩展该类,以便可以访问其内容以处理一些关键的路由功能。

那么,一个类如何扩展具有相同名称的另一个类? class Controller extends Controller这是不行的, 除非有办法区分这两个类而这也正是namespace来得心应手和use关键字有助于完成任务,允许使用; (类;方法;接口和常量),在相同范围内具有相同的名称。

现在如何在代码中完成?很简单!如果我们查看 app / Http / Controllers / Controller.php源代码,我们可以看到类名称空间的顶部声明为:namespace App\Http\Controllers,因此这是为类提供名称空间的方式,以便其他类现在可以引用它这看起来与从项目的根目录到此类的路径相同,几乎没有什么区别,只是使用了“\”而不是“/(与Windows中的命令提示符相同),但是还有另一个区别,那就是带有大写字母的App命名空间中的“ A”与路径中小写字母“ a”的“ app”相对。另请注意,名称空间区分大小写。

因此,名称空间是路径以外的一个单独概念,如果有帮助,它可以遵循路径结构,但不必一定是类,方法,接口或常量的确切路径,例如,请查看: vendor / laravel / framework /src/Illuminate/Routing/Controller.php源代码,

我们在类的顶部看到名称空间被声明为: Illuminate\Routing

现在让我们看一下use我们使用的“ use”关键字,使我们的类了解要在类中使用的特定类或函数

因此,我们不会导入或包含任何内容,只是让我们的类知道它们将通过其名称空间引用它们而使用特定的类或方法,让我们看一下app / Http / Controllers / Controller.php源代码,如下所示:您可以从以下行中看到:“ use Illuminate\Routing\Controller as BaseController”,“ use”关键字 以及目标类的名称空间(请注意,Illuminate \ Routing \ Controller.php和Illuminate \ Routing \ Controller'不带.php扩展名'是可互换的)

我们可以将“ as”关键字与“ ”关键字一起使用,use为特定的类,方法,接口或常量提供一个别名,该别名使 app / Http / Controllers / Controller.php可以将Illuminate \ Routing \ Controller.php扩展为BaseController。行:“ class Controller extends BaseController”。


9

有其他编程语言中的名称空间之类的技术(例如Java中的包)。它们过去曾经能够拥有与项目同名的多重类。

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

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


1
与Java比较是个坏主意。Java有软件包,并且有软件包可见性类。受保护成员的可见性还取决于访问它的软件包。
Artefacto

1
它们不等于包装,但它们具有相同的想法。
2ndkauboy

由于该问题还询问总体上是什么名称空间,因此答案很有意义。
kiamlaluno,2010年

@kiam他们有一个想法-不冲突的类名。他们不同意可见性。
Artefacto

@Artefacto:Kau-Boy没有说两种语言的名称空间是相同的。
kiamlaluno

4

很像目录文件,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        

该原理扩展到了编程字中的命名空间。


3

命名空间的工作方式类似于目录。您知道如何将文件放在与父(或任何其他)目录中文件名称相同的目录中吗?好的,命名空间使您可以在应用程序内对变量,函数和类进行操作。

不久前,PHP对于大型静态函数类已经出现了一些趋势。调用任何这些函数的唯一方法是在调用之前加上类名。这是对名称空间的原始尝试,但没有太多好处。


2

命名空间基本上使您可以将代码放入容器中。这将防止共享相同名称的两个函数(以及类和变量)出现问题。

当使用较大的应用程序来防止共享相同名称的代码出现问题时,这些功能很有用。

例如,假设我们需要两个名为“ TheMessage”的函数。这些都将分别打印(回显)不同的消息。通常,这将导致语法错误,因为不能有两个共享相同名称的函数。

要解决此问题,可以将这些函数放在单独的名称空间中。这样您就可以使用这两个功能而不会出现任何错误。


2

命名空间就像将许多东西包装到一个包中。想象一下一个命名空间,就像一个抽屉,您可以在其中放置各种东西:铅笔,尺子,一张纸等等。为了避免使用彼此的物品,您决定在抽屉上贴上标签,以便清楚地知道谁属于谁。


0

命名空间用于封闭一组代码,以便可以在不同的地方使用它们而不会造成名称冲突。将其视为jQuery无冲突方法,您会更好地理解它。


“ jQuery无冲突方法”是什么意思?那和PHP有什么关系?
Nico Haase

0

命名空间是一个用于控制程序中名称的简单系统。
它确保名称是唯一的,并且不会导致任何冲突。


您在谈论哪种“名称”?
Nico Haase

0

您可以使用命名空间来避免所创建的代码与内部PHP类/函数/常量或第三方类/函数/常量之间的名称冲突。命名空间还具有别名(或缩短)Extra_Long_Names的能力,这些Extra_Long_Names旨在减少第一个问题,从而提高源代码的可读性。

众所周知,名称空间和特性在PHP中并不是新事物,但由于其复杂性,许多PHP开发人员仍未使用这些出色的概念。因此,在这篇文章中。我将尝试通过示例清除它们。什么是名称空间和特征?

如何在代码中实现它们,以使代码可重用和可扩展?

命名空间的好处

您可以使用命名空间来避免所创建的代码与内部PHP类/函数/常量或第三方类/函数/常量之间的名称冲突。

命名空间还具有别名(或缩短)Extra_Long_Names的能力,这些别名旨在减少第一个问题,从而提高源代码的可读性。让我们通过一个例子来理解命名空间。在htdocs(xampp)或www(xwamp)中创建一个名为“ php_oops”的文件夹,在名为“ namespaces”的根目录下创建一个新文件夹,然后在namespaces文件夹下创建一个文件index.php。

<?php
// FilePath:- namespaces/index.php

// let's say, we have two classes in index,
// here, these two classes have global space
class A 
{ 
   function __construct()
   { 
      echo "I am at Global space, Class A";
   }
}
class B
{
   function __construct()
   {
      echo "I am at Global space, Class B";
   }
}
// now create an object of class and 
$object = new A; // unqualified class name
echo "<br/>";
$object = new \B; // fully qualified class name
// output: 
I am at Global space, Class A
I am at Global space, Class B

参考 -https://medium.com/@akgarg007/php-laravel-namespaces-and-traits-01-9540fe2969cb


1
链接到其他站点上的自己的内容时请小心,您不想成为垃圾邮件发送者。您应该在此处包括大部分内容,并且仅将链接用作参考。
Dharman
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.