cbe*_*ski 554
命名空间适用于函数和类,范围对变量的作用.它允许您在同一程序的不同部分使用相同的函数或类名,而不会导致名称冲突.
简单来说,将名称空间视为一个人的姓氏.如果有两个名为"约翰"的人,你可以使用他们的姓氏来区分他们.
假设您编写了一个使用名为的函数的应用程序output().您的output()函数会获取页面上的所有HTML代码并将其发送给用户.
稍后您的应用程序会变大,并且您希望添加新功能.您添加了一个允许您生成RSS源的库.该库还使用一个名为的函数output()来输出最终的feed.
当你打电话时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!';
}
Run Code Online (Sandbox Code Playgroud)
后来当我们想要使用不同的功能时,我们会使用:
\MyProject\output();
\RSSLibrary\output();
Run Code Online (Sandbox Code Playgroud)
或者我们可以声明我们在一个命名空间中然后我们可以调用该命名空间output():
namespace MyProject;
output(); # Output HTML page
\RSSLibrary\output();
Run Code Online (Sandbox Code Playgroud)
如果我们没有名称空间,我们必须(可能)在我们添加库时随时更改大量代码,或者提出繁琐的前缀以使我们的函数名称唯一.使用命名空间,我们可以避免在将第三方代码与我们自己的项目混合时命名冲突的麻烦.
ale*_*lex 19
命名空间允许您在名称下放置一堆代码,并且与类,函数和常量没有任何命名冲突.
它允许您的代码存在于该命名空间中.
PHP使用有争议的字符 \来显示命名空间级别.人们站起来因为它也被用作逃脱角色.
要在PHP中使用命名空间,请在文件顶部使用类似的内容.
namespace my\namespace;
Run Code Online (Sandbox Code Playgroud)
在其他编程语言中有像命名空间这样的技术(比如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.同样的原则延伸到编程世界中的命名空间.
由于通过了解“名称空间”更容易了解关键字“使用”,因此,让我先看一个基本的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?
除非有一种方法可以区分这两个类,否则这将不起作用,并且这很方便,并且关键字有助于完成的任务,允许使用;(类;方法;接口和常量),在相同范围内具有相同的名称。namespaceuse
现在如何在代码中完成?很简单的!如果我们查看 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”。
命名空间的工作方式类似于目录。您知道如何将文件放入与父(或任何其他)目录中的文件同名的目录中吗?好吧,命名空间允许您在应用程序中为变量、函数和类执行此操作。
不久前,PHP 中出现了一些关于大量静态函数类的趋势。调用任何这些函数的唯一方法是在调用前加上类名。这是对命名空间的原始尝试,但没有太多好处。
小智 5
与目录和文件非常相似,PHP 中的命名空间用于对类、函数、接口和常量进行分组。
例子:
Filesystem | PHP Namespace
----------------|------------------
/Dir/File.txt | \Namespace\Class
Run Code Online (Sandbox Code Playgroud)
它提供了一种从全局空间包装项目的方法,并允许使用普通项目名称,而不会导致程序中的名称冲突。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
Run Code Online (Sandbox Code Playgroud)
这个原则延伸到了编程语言中的命名空间。
| 归档时间: |
|
| 查看次数: |
78891 次 |
| 最近记录: |