什么是命名空间?

时间:2010-08-01 23:55:21

标签: php namespaces

什么是PHP命名空间?

一般来说什么是命名空间?

Layman回答一个例子会很棒。

11 个答案:

答案 0 :(得分:528)

命名空间对函数和类的作用适用于变量。它允许您在同一程序的不同部分使用相同的函数或类名,而不会导致名称冲突。

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

情景

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

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

当您致电output()时,PHP如何知道是使用您的output()函数还是RSS库的output()函数?它没有。 除非您正在使用名称空间。

实施例

我们如何解决两个output()函数?简单。我们将每个output()函数粘贴在自己的namespace

这看起来像这样:

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();

没有命名空间?

如果我们没有名称空间,我们必须(可能)在我们添加库时随时更改大量代码,或者提出繁琐的前缀以使我们的函数名称唯一。使用命名空间,我们可以避免在将第三方代码与我们自己的项目混合时命名冲突的麻烦。

答案 1 :(得分:18)

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

它允许您的代码在该命名空间中 live

PHP使用somewhat controversial character \来显示命名空间级别。人们站起来因为它也被用作逃脱角色。

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

namespace my\namespace;

您可以在official PHP documentation for namespaces上找到更多信息。

答案 2 :(得分:9)

在其他编程语言中存在名称空间等技术(如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。同样的原则延伸到编程世界中的命名空间。

答案 3 :(得分:4)

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

在路径中有一个名为: Controller.php 的控制器类: 从项目的根目录中 app / Http / Controllers 还有另一个名为: Controller.php 的控制器类,但是这个控制器类在路径中: 从项目的根目录 vendor / laravel / framework / src / Illuminate / Routing

如果你是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被声明为:namespace App\Http\Controllers,所以这就是你给类命名空间的方式,以便它可以被其他类引用 现在这看起来与项目根目录中该类的路径相同,几乎没有区别,而是使用“\”代替“/(与Windows中的命令提示符相同), 但是还有另外一个区别,那就是在命名空间中使用大写'A'而在'app'中使用的应用程序 路径中的小写'a'。 另请注意,命名空间区分大小写。

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

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

现在让我们看看“use”关键字, 我们使用“use”关键字让我们的类知道我们想要在类中使用的特定类或函数

所以我们不会导入或包含任何内容我们只是让我们的班级知道我们将使用特定的类或 方法通过命名空间引用它们 我们来看看 app / Http / Controllers / Controller.php 源代码, 正如您从行中看到的那样:“use Illuminate\Routing\Controller as BaseController”,“use”关键字后跟名称空间 对于目标类 (请注意,没有.php扩展名的Illuminate \ Routing \ Controller.php和Illuminate \ Routing \ Controller'可以互换)

我们可以使用“as”关键字和“use”关键字来为特定的类,方法,接口或常量提供允许的别名 app / Http / Controllers / Controller.php Illuminate \ Routing \ Controller.php 扩展为BaseController中的线: “class Controller extends BaseController”。

答案 4 :(得分:2)

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

当在较大的应用程序中工作时,这些功能非常有用,可以防止代码共享同名的问题。

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

要解决此问题,您可以将这些函数放入单独的命名空间中。这将允许您使用这两个函数而没有任何错误。

答案 5 :(得分:2)

目录文件非常相似,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        

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

答案 6 :(得分:1)

命名空间的工作方式与目录类似。您知道如何将文件放在与父(或任何其他)目录中的文件同名的目录中吗?好吧,命名空间允许您在变量,函数和类的应用程序中执行此操作。

不久之前PHP中有一些趋势对于大类的静态函数。调用任何这些函数的唯一方法是使用类名称为调用添加前缀。这是对命名空间的一种原始尝试,但没有太大的好处。

答案 7 :(得分:1)

命名空间就像把很多东西打包成一个包。想象一个名称空间作为抽屉,你可以在其中放置各种东西:铅笔,尺子,一张纸等等。为避免使用彼此的物品,您决定标记抽屉,以便清楚属于谁。

答案 8 :(得分:0)

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

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

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

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

名称空间的优点

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

命名空间还具有别名(或缩短)Extra_Long_Names的能力,这些别名旨在减少第一个问题,从而提高源代码的可读性。 让我们以示例的方式了解名称空间。 在htdocs(xampp)或www(xwamp)中创建一个名为“ php_oops”的文件夹 在根目录下创建一个名为“命名空间”的新文件夹,然后在命名空间文件夹下创建一个文件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