首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >秒懂php的命名空间

秒懂php的命名空间

作者头像
碧海长天
发布2021-10-21 16:00:47
发布2021-10-21 16:00:47
2.2K0
举报
文章被收录于专栏:golang探索者golang探索者

秒懂php的命名空间

2018-1-1

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

但其实使用了很久命名空间后,我才对它有了一些理解。

命名空间,主要解决了3个麻烦:

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

2.为了缓解麻烦1,通常编写各种class时会使用较长的类名或为实现不同功能的class添加名称前缀(或后缀)。

3.不使用魔法函数__autoload的情况下,而每个class又独占一个php文件时,为了调用不同的class,会在使用这些class的另外的php文件的开头位置书写较多的include(或require或require_once)语句。

接下来,通过一个小例子,让你秒懂明明空间怎么用~

Tips:以下示例中成为了两个文件,一个Demo.php,一个index.php,两个文件处于同级目录下;Demo.php文件中书写命名空间以及Demo类,index.php调用Demo.php中的Demo类;如下示例中的“输出结果”即表示浏览器访问index.php。

Demo.php文件代码:

代码语言:javascript
复制
<?php
namespace DemoNameSpace;
 
class Demo {
    private $mysqlHandle;
 
    public function __construct() {
        echo 'This is namespace of PHP demo ,The Demo magic constant "__NAMESPACE__" is '.__NAMESPACE__;
    }
}
?>

index.php文件代码

代码语言:javascript
复制
<?php
    include 'Demo.php';
    use DemoNameSpace\Demo;
    $DemoObj = new Demo();
?>

输出结果1:“This is namespace of PHP demo ,The Demo magic constant "__NAMESPACE__" is DemoNameSpace”

以上示例的说明:Demo.php中有一个_NAMESPACE__魔法常量;“它包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。”

接着做示例:

Demo.php不做变动,改动index.php文件,如下:

代码语言:javascript
复制
<?php
    include 'Demo.php';
    $Demo = new Demo();
?>

输出结果2:“Fatal error: Class 'Demo' not found in F:\JJserver\demo\index.php on line 4”

这个是常见的“致命错误”信息了。按照常规的php编程思路,这里的输出应该是跟“输出结果1”一致的,但这里它偏要来个致命错误,这下要抓狂了吧?~

行,先把抓狂的麻烦解决,去掉(或注释掉)Demo.php文件中的:“namespace DemoNameSpace;”这个语句,就正常了。这是咱们平常写class以及调用class最常见的书写方法,就不再解释这种不使用namespace的情况了。

对比使用namespace与不使用namespace的两种输出情况,并加入namespace的定义理解后,上述出现致命错误的情况就很好理解了。在Demo.php中定义了一个namespace,也就是命名空间后,接着定义了Demo类,然后这个Demo类就被归并到了DemoNameSpace命名空间中去了,那么要调用这个Demo类时,自然要先调用这个DemoNameSpace命名空间了,也就是在index.php文件中使用“useDemoNameSpace\Demo”语句了。

再放一下上面那三个麻烦:

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

2.为了缓解麻烦1,通常编写各种class时会使用较长的类名或为实现不同功能的class添加名称前缀(或后缀)。

3.不使用魔法函数__autoload的情况下,而每个class又独占一个php文件时,为了调用不同的class,会在使用这些class的另外的php文件的开头位置书写较多的include(或require或require_once)语句。

对比一下,是不是能解决这些麻烦呢~  快快思考

ok,完结。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 秒懂php的命名空间
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档