慕课网教程:
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了。所以,当我们看到一个类名前加上一个,说明该类不存在于任何命名空间之中。
以上