碧海长天

好看的皮囊千篇一律,有趣的灵魂万里挑一。

秒懂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文件代码:
<?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文件代码
<?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文件,如下:

<?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,完结。

标签: PHP