PHP的命名空间的介绍

PHP的命名空间的介绍

内容导读

收集整理的这篇技术教程文章主要介绍了PHP的命名空间的介绍,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4522字,纯文字阅读大概需要7分钟

内容图文

这篇文章主要介绍了关于PHP的命名空间,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

什么是PHP命名空间?

(PHP 5 >= 5.3.0, PHP 7)

什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子,文件 foo.txt 可以同时在目录/home/greg/home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。

在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:

  1. 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。

  2. 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

虽然任意合法的PHP代码都可以包含在命名空间中,但只有以下类型的代码受命名空间的影响,它们是:类(包括抽象类和traits)、接口、函数和常量。

命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间,除了一个以外:declare关键字。

在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。另外,所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前:

<html><?phpnamespace MyProject; // 致命错误 - 命名空间必须是程序脚本的第一条语句?>

另外,与PHP其它的语言特征不同,同一个命名空间可以定义在多个文件中,即允许将同一个命名空间的内容分割存放在不同的文件中。

1. 例一
首先我们先建立两个类文件

a.php

<?phpclass Test{

public function ceshi(){



echo __FILE__;

}}

b.php

<?phpclass Test{

public function ceshi(){



echo __FILE__;

}}

index.php

<?phprequire_once("a.php");require_once("b.php");

现在运行index.php文件

你会发现有一个致命错误: Fatal error: Cannot redeclare class Test in。。。很显然,无法重新声明Test类,因为你引入了两次,而且两个文件中的类名称相同,冲突了。这个时候就需要命名空间来解决这个问题,并且很容易。

2. 例二
我们现在把两个类文件稍作修改。

a.php

<?phpnamespace demo1aTest;class Test{

public function ceshi(){



echo __FILE__;

}}

b.php

<?phpnamespace demo1bTest;class Test{

public function ceshi(){



echo __FILE__;

}}

namespace关键字是用来声明命名空间的。现在运行index.php发现没有错误,修改index.php进行方法调用测试

index.php

<?phprequire_once("a.php");require_once("b.php");$a1 = new demo1aTestTest();$a1->ceshi();

现在运行index.php文件

D:phpStudyWWWdemodemo1a.php

3. 例三

现在有另外一种情况,比如我需要实例化a.php中的Test类多次,那么每次我们都需要命名空间信息完整写的话比较麻烦怎么办呢?比如:

<?phprequire_once("a.php");require_once("b.php");$a1 = new demo1aTestTest();$a2 = new demo1aTestTest();$a1->ceshi();echo '<br/>';$a2->ceshi();

虽然也没有错误,但是你会发现比较麻烦,每次都需要全写命名空间名称,虽然不报错并且可以ctrl+c,ctrl+v,但是不太美观(^_^)。

你可以这样做

index.php

<?phprequire_once("a.php");require_once("b.php");use demo1aTestTest;$a1 = new Test();$a2 = new Test();$a1->ceshi();echo '<br />';$a2->ceshi();

use关键字是用来引入类,用命名空间的方式表示使用了某个类。后面就可以直接实例化操作

4. 例五

接下来另一个问题又来了,如下:

index.php

<?phprequire_once("a.php");require_once("b.php");use demo1aTestTest;use demo1bTestTest;$a = new Test();$b = new Test();$a->ceshi();echo '<br />';$b->ceshi();

现在运行index.php文件

Fatal error: Cannot use demo1bTestTest as Test because the name is already in use in D:phpStudyWWWdemodemo1index.php on line 5

因为虽然使用了命名空间,但是两个类名称相同,都是Test,程序不知道第二个Test类是b.php中的Test类,这时候你就用到了as关键字

index.php

<?phprequire_once("a.php");require_once("b.php");use demo1aTestTest;use demo1bTestTest as bTest;$a = new Test();$b = new bTest();$a->ceshi();echo '<br />';$b->ceshi();

as关键字是对类名称定义别名,可以有效防止类名称相同冲突

5. 例六

比如我们在a.php同级再建立一个全局类文件:c.php:

c.php

<?phpclass Test{

public function ceshi(){



echo __FILE__;

}}

在index.php文件中这样做即可调用c.php中的test方法

<?phprequire_once("a.php");require_once("b.php");require_once("c.php");use demo1aTestTest;use demo1bTestTest as bTest;$a = new Test();$a->ceshi();echo '<br />';$b = new bTest();$b->ceshi();echo '<br />';$c = new Test();$c->ceshi();echo '<br />';

我们将这种类叫做全局类,如果要使用需要类前面加入反斜杠””

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

关于PHP多态的理解

PHP文件编程的介绍

以上就是PHP的命名空间的介绍的详细内容,更多请关注Gxl网其它相关文章!

内容总结

以上是为您收集整理的PHP的命名空间的介绍全部内容,希望文章能够帮你解决PHP的命名空间的介绍所遇到的程序开发问题。 如果觉得技术教程内容还不错,欢迎将网站推荐给程序员好友。

内容备注

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。


本文关键词:

联系我们

在线咨询:点击这里给我发消息

邮件:w420220301@qq.com