什么是PHP名称空间?
大体上什么是名称空间?
一个外行的回答和一个例子将是伟大的。
什么是PHP名称空间?
大体上什么是名称空间?
一个外行的回答和一个例子将是伟大的。
当前回答
命名空间的工作方式类似于目录。您知道如何将文件放在与父目录(或任何其他目录)中的文件名称相同的目录中吗?好吧,命名空间让你在应用程序中为变量、函数和类做到这一点。
不久前,PHP中出现了一种趋势,即大量的静态函数类。调用这些函数的唯一方法是在调用前加上类名。这是对名称空间的一种原始尝试,但没有多少好处。
其他回答
我们经常需要给资源一个名字,一个标签,这将有助于我们理解和谈论它是什么。但是命名不仅仅是分配字符序列这么简单的任务。名称是用来区别事物的。
尽管一个标识符引用一个资源,但这并不意味着没有两个标识符是相同的。
我们可以通过GUID或添加关于名称空间的信息来防止或减少标识符冲突。Namespace是从中选择名称或标识符的域。当我们向标识符添加命名空间时,我们创建了限定名称。
例如时间!
假设在邮编99501中只有一个叫JOHN_SMITH的人。邮政编码86302的JOHN_SMITH也只有一个。那么,当我们提到JOHN_SMITH时,我们怎么知道我们说的是哪个JOHN_SMITH呢?
当我们在邮政编码99501的上下文中讨论,并提到JOHN_SMITH时,我们谈论的是邮政编码99501的JOHN_SMITH。
<?php
namespace zc99501;
const JOHN_SMITH = "John Smith from 99501";
?>
当我们在邮政编码86302的上下文中讨论,并提到JOHN_SMITH时,我们谈论的是邮政编码86302的JOHN_SMITH。
<?php
namespace zc86302;
const JOHN_SMITH = "John Smith from 86302";
?>
现在,如果一个邮编为99501的人和另一个邮编为86302的人想要谈论JOHN_SMITH,会发生什么?他们必须说来自99501的JOHN_SMITH做了这个,来自86302的JOHN_SMITH做了那个。
<?php
namespace zc99501;
const JOHN_SMITH = "John Smith from 99501";
namespace zc86302;
const JOHN_SMITH = "John Smith from 86302";
namespace Test;
echo \zc99501\JOHN_SMITH . PHP_EOL;
echo \zc86302\JOHN_SMITH . PHP_EOL;
?>
这里,\zc99501\JOHN_SMITH和\zc86302\JOHN_SMITH是限定名。
另一个例子。
假设在一个上下文中,当我们使用常量Title时,我们指的是Book Title。以及作者姓名。
<?php
namespace Book;
const title = "Don Quixote";
const name = "Miguel de Cervantes Saavedra";
?>
在另一种情况下,我们通过标题来表示角色的标题。以及角色的名字。
<?php
namespace Character;
const title = "Sir";
const name = "Sancho Panza";
?>
当我们在两个上下文中都需要标题和名字时,我们必须明确区分书名和角色的标题。我们还必须明确区分作者名和角色名。
<?php
namespace Book;
const title = "Don Quixote";
const name = "Miguel de Cervantes Saavedra";
namespace Character;
const title = "Sir";
const name = "Sancho Panza";
namespace Test;
echo \Book\title . PHP_EOL;
echo \Book\name . PHP_EOL;
echo \Character\title . PHP_EOL;
echo \Character\name . PHP_EOL;
?>
这里的\Book\title、\Book\name、\Character\title和\Character\name是限定名称。
注意:在PHP中,只有四种类型的代码会受到名称空间的影响:类、接口、函数和常量。
就是这样。
Namespace就像将许多东西打包到一个包中。将命名空间想象成一个抽屉,您可以在其中放各种东西:一支铅笔、一把尺子、一张纸等等。为了避免使用彼此的物品,你们决定在抽屉上贴上标签,这样就能清楚地知道什么东西属于谁。
命名空间基本上允许您将代码放入容器中。这将防止使用相同名称的两个函数(以及类和变量)出现问题。
这在大型应用程序中非常有用,可以防止代码段共享相同名称的问题。
例如,假设我们需要两个名为“TheMessage”的函数。这两者都将分别打印(回显)不同的消息。 通常,这将导致语法错误,因为您不能有两个具有相同名称的函数。
要解决这个问题,可以将这些函数放到单独的名称空间中。这将允许您使用两个函数而不会出现任何错误。
您可以使用命名空间来避免您创建的代码与内部PHP类/函数/常量或第三方类/函数/常量之间的名称冲突。 命名空间还能够别名(或缩短)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
命名空间的工作方式类似于目录。您知道如何将文件放在与父目录(或任何其他目录)中的文件名称相同的目录中吗?好吧,命名空间让你在应用程序中为变量、函数和类做到这一点。
不久前,PHP中出现了一种趋势,即大量的静态函数类。调用这些函数的唯一方法是在调用前加上类名。这是对名称空间的一种原始尝试,但没有多少好处。