PHP 命名空间namespace 和 use

慕课网教程:

http://www.imooc.com/video/7834

 

PHP 中命名空间的概念和高级语言(如C#、JAVA)有很大的差异,一度让我混淆甚至怀疑它存在的意义和目的。

今天找时间学习了一下才明白它的作用:防止类名(class)重复

 

我们从一个简单的demo来学习一下命名空间;

先分别新建两个简单的类文件,并且故意让类名重复;

 

a.php

# a.php
<?php 
class Apple {
    public function get_info(){
        echo "a";
    }
}

 

b.php

#b.php
<?php 
class Apple {
    public function get_info(){
        echo "b";
    }
}

 

再新建一个测试页面index.php,分别引用两个类文件

<?php 

require_once 'a.php';
require_once 'b.php';

$a = new Apple;
$a->get_info();

 

打开页面后你会看到报错咯:

 

 

原因很明显就是类名冲突了,那改一下类名不就得了?是的,但某些场景下,我们可能避免不了发生这样的冲突。

PHP给我们提供的解决方案就是命名空间(namespace

 


PHP中的命令空间作用,有点像将类放入不同的文件夹中(如ac 或者 def)管理,这样一来,不同命名空间下的类就不会互相影响了。因为编译器会认为他们不是同一个类。写法如下:

<?php 
namespace ac;
class Apple { public function get_info(){ echo "a"; } }

 

再次打开index.php页面发现错误消失了,并且输出了b。说明了使用了b的Apple类

如果我想使用a的Apple类应该如何做呢?在index.php中使用 use 关键字,指定我们要使用ac命名空间下的Apple类,代码如下:

<?php 
# 让编译器知道下列的new Apple都是使用ac命名空间下的类
use acApple;

require_once 'a.php';
require_once 'b.php';

$a = new Apple;  // 等同于 $a = new acApple

$a->get_info();

打开index.php,页面成功输出了a 

再来探讨另一种情况,如果b的Apple类也存在于命名空间下: 

<?php 

namespace def;

class Apple {
    public function get_info(){
        echo "b";
    }
}

那么我在index.php中就算使用 use defApple 很显然会替换掉了use acApple;这个时候可以使用 AS 关键字 用来设置别名

代码如下: 

<?php 

use acApple;
use defApple as bApple;

require_once 'a.php';
require_once 'b.php';

$a = new Apple;
$a->get_info();

$b = new bApple();
$b->get_info();

打开页面就可以看到成功输出了b,并且这个时候使用a的Apple类也不会影响输出a

再来看最后一种情况,如果现在添加一个类文件c.php

<?php 

class Apple {
    public function get_info(){
        echo "c";
    }
}

c的Apple类没有放置在任何的命名空间下,那么在Index.php中又应该如何使用而不和a、c冲突呢,很简单,在Apple类前加一个即可作为最高权限。代码如下:

<?php 
use acApple;
use defApple as bApple;

require_once 'a.php';
require_once 'b.php';
require_once 'c.php';

$a = new Apple;
$a->get_info();

$b = new bApple();
$b->get_info();


$c = new Apple();  
$c->get_info();

 打开页面即可正常输出abc了。所以,当我们看到一个类名前加上一个,说明该类不存在于任何命名空间之中。

以上

原文地址:https://www.cnblogs.com/CyLee/p/6349818.html