关于PHP命名空间的声明和使用

时间: 2015-08-15 14:24 栏目: PHP 浏览: 4918 赞: 1160 踩: 0 字体:

以下为本篇文章全部内容:

        今天给大家讲讲PHP的命名空间,在其他编程语言里面早就已经出现了,只是在一些编程语言里面不是叫命名空间而是包,PHP的命名空间跟java的包很类似,学过java的同学应该很容易就能理解。那么什么是命名空间,我这里借助一下百科的解释:命名空间是用来组织和重用代码的。如同名字一样的意思,NameSpace(名字空间),之所以出来这样一个东西,是因为人类可用的单词数太少,并且不同的人写的程序不可能所有的变量都没有重名现象,对于库来说,这个问题尤其严重,如果两个人写的库文件中出现同名的变量或函数(不可避免),使用起来就有问题了,为了解决这个问题,引入了名字空间这个概念,通过使用 namespace xxx;你所使用的库函数或变量就是在该名字空间中定义的,这样一来就不会引起不必要的冲突了。

        根据上面的解释我们可以知道命名空间是用来避免重名冲突的,PHP的命名空间在以前使用比较少,其主要一个原因就是PHP直到5.3才开始推出这个命名空间,在命名空间出来之前呢,我们一个PHP文件同时引入两个不同的PHP文件,但是那两个PHP文件分别有着相同的类名或者函数名,这个时候PHP就会给我们报错告诉我们函数名重复了,在我的视频里面会有讲到这部分,大家也可以看到报错的信息。我想PHP命名空间在国内得到广泛的使用应该归功于ThinkPHP吧,因为ThinkPHP3.2就开始采用了命名空间的形式,而国内使用框架的人大部分都是用ThinkPHP,也就是说你缩写的每一个控制器都需要声明和导入命名空间。那么命名空间怎么声明和使用呢,我们用代码来实际的操作一下,大家必须记住下面两个关键词。

        声明:usenamespace

        导入:use

>

高清视频下载地址:http://yunpan.cn/cdWpG9DMxu7Xq (提取码:15c4)

                                链接:http://pan.baidu.com/s/1c0nq88o 密码:uqmn                                                                 

        我们先定义一个php文件引入两个php文件函数名相同的案例

        sunnyblog.php

<?php
function sunny(){
    echo "SunnyBlog";
}

        sunnyweb.php

<?php
function sunny(){
    echo "SunnyWeb";
}

        sunny.php

<?php
require 'sunnyblog/sunnyblog.php';
require 'sunnyweb/sunnyweb.php';

大家执行sunny.php这个文件会发现爆出错误信息Fatal error: Cannot redeclare sunny() (previously declared in  这个错误的意思是sunny这个函数名重复了,这种情况的话我们遇到的情况特别多,特别是团队开发的时候不可能没有不重名的,今天我们就用命名空间来解决这个问题。

  sunnyblog.php

<?php
namespace sunnyblog;//声明命名空间
function sunny(){
    echo "SunnyBlog";
}

        sunnyweb.php

<?php
namespace sunnyweb;//声明命名空间
function sunny(){
    echo "SunnyWeb";
}

        sunny.php

<?php
require 'sunnyblog/sunnyblog.php';
require 'sunnyweb/sunnyweb.php';

sunnyblog\sunny();//通过不同命名空间调用函数
echo "<br>";
sunnyweb\sunny();//通过不同命名空间调用函数

        上面是对于不同文件相同函数的案例,我们接下来讲讲不同文件夹里面的类该如何使用,假如我根目录里面有两个文件夹一个是sunnyblog一个是sunnyweb,里面分别有sunnyblog.php和sunnyweb.php两个文件,当我们不使用命名空间的时候同样的会跟上面的一样爆出错误Fatal error: Cannot redeclare class 说类名重复,我们这里就不演示了,直接上命名空间之后的代码。

        sunnyblog/sunnyblog.php

<?php
namespace sunnyblog;//声明命名空间
class SunnyBlog{
	public function sunny(){
		echo "SunnyWEB";
	}
}

        sunnyweb/sunngweb.php

<?php
namespace sunnyweb;//声明命名空间
class SunnyBlog{
	public function sunny(){
		echo "SunnyWEB";
	}
}

        sunny.php

<?php
require 'sunnyblog/sunnyblog.php';
require 'sunnyweb/sunnyweb.php';
$a = new sunnyblog\SunnyBlog();
$a->sunny();
echo "<br>";
$b = new sunnyweb\SunnyBlog();
$b->sunny();

        通过上述代码我们就可以解决了类名冲突的问题,接下来我们讲讲命名空间的导入和别名,怎么做呢?我们修改一下sunny.php这个文件

        sunny.php

<?php
require 'sunnyblog/sunnyblog.php';
require 'sunnyweb/sunnyweb.php';
use sunnyweb as sunny;//导入命名空间并通过as起别名
$a = new sunnyblog\SunnyBlog();
$a->sunny();
echo "<br>";
$b = new sunny\SunnyBlog();//通过别名调用
$b->sunny();

        4C7A8F38-3EFB-47CC-9701-550746B50BCD.png

        通过别名和不是别名的结果是一样的。命名空间说复杂也不复杂说难也不难,看大家怎么去理解了。

谢谢大家对本博客的支持,本站专注原创技术文章,且看且珍惜博主的心得。请转载带上本文链接注明出处。

扫二维码快速加群:

qun.png

如果大家有什么疑问可以加我QQ327388905进行解答,也可以加入交流群ThinkPHP交流群