Answers:
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();
如果没有命名空间,则每次添加库时(潜在)都要更改很多代码,或者想出乏味的前缀来使函数名唯一。使用名称空间,当将第三方代码与我们自己的项目混合时,我们可以避免命名冲突的麻烦。
由于通过了解“名称空间”更容易了解关键字“使用”,因此,让我先通过看一个基本的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
”。
有其他编程语言中的名称空间之类的技术(例如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。相同的原理扩展到编程世界中的名称空间。
很像目录和文件,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
该原理扩展到了编程字中的命名空间。
命名空间就像将许多东西包装到一个包中。想象一下一个命名空间,就像一个抽屉,您可以在其中放置各种东西:铅笔,尺子,一张纸等等。为了避免使用彼此的物品,您决定在抽屉上贴上标签,以便清楚地知道谁属于谁。
命名空间用于封闭一组代码,以便可以在不同的地方使用它们而不会造成名称冲突。将其视为jQuery无冲突方法,您会更好地理解它。
您可以使用命名空间来避免所创建的代码与内部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