PHP命名空间namespace使用小结

1.介绍一下php的命名空间

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

在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:

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

为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

PHP 命名空间提供了一种将相关的类、函数和常量组合到一起的途径。

2.php那个版本以上支持命名空间?
PHP 在 5.3.0 以后的版本开始支持命名空间

3.测试示例
a.测试一

测试文件的目录结构及路径如下:
E:\myphp\research\namespace\market\fruit\inc.php
E:\myphp\research\namespace\market\fruit\inc_test1.php
E:\myphp\research\namespace\market\fruit\inc_test2.php
E:\myphp\research\namespace\market\fruit\inc_test3.php
E:\myphp\research\namespace\market\fruit\inc_test4.php
E:\myphp\research\namespace\market\fruit\inc_test5.php
E:\myphp\research\namespace\market\fruit\inc_test6.php

inc.php

 1 <?php
 2 /*
 3  * @date 2016-4-8
 4  * @author caihuafeng
 5  */
 6 namespace market\fruit;
 7 class Apple {
 8     public function __construct($file = __FILE__) {
 9         echo sprintf("Inner |%s|, invoked by file:|%s|\n", __METHOD__, $file);
10     }
11 }
12 ?>

inc_test1.php

 1 <?php
 2 /*
 3  * @date 2016-4-8
 4  * @author caihuafeng
 5  */
 6 include_once(‘inc.php‘);
 7
 8 //实例化类Apple时直接在前面加上命名空间
 9 $apple = new \market\fruit\Apple(__FILE__);
10
11 //输出Inner |market\fruit\Apple::__construct|, invoked by file:|E:\myphp\research\namespace\market\fruit\inc_test1.php|
12
13 //用new market\fruit\Apple(__FILE__); 或 new \market\fruit\Apple(__FILE__);均输出同样的结果,即market前面有没有\结果都一样
14 ?>

inc_test2.php

 1 <?php
 2 /*
 3  * @date 2016-4-8
 4  * @author caihuafeng
 5  */
 6 namespace market\fruit; //调整当前脚本到market\fruit这个命名空间,而且namespace申明必须在第一句
 7 include_once(‘inc.php‘);
 8
 9 //由于上面第一行声明了类Apple的命名空间market\fruit,因此下面实例化类Apple的时候,就不需要在Apple前面加上命名空间market了
10 $apple = new Apple(__FILE__);
11 //输出Inner |market\fruit\Apple::__construct|, invoked by file:|E:\myphp\research\namespace\market\fruit\inc_test2.php|
12 ?>

inc_test3.php

 1 <?php
 2 /*
 3  * @date 2016-4-8
 4  * @author caihuafeng
 5  */
 6 include_once(‘inc.php‘);
 7
 8 //定义别名, market\fruit\Apple最后面Apple是类名,定义market\fruit\Apple的别名为mfa
 9 use market\fruit\Apple as mfa;
10
11 //由于上面声明了定义market\fruit\Apple的别名为ma,因此下面可以直接用mfa代替market\fruit\Apple
12 $apple = new mfa(__FILE__);
13 //输出Inner |market\fruit\Apple::__construct|, invoked by file:|E:\myphp\research\namespace\market\fruit\inc_test3.php|
14 ?>

inc_test4.php

 1 <?php
 2 /*
 3  * @date 2016-4-8
 4  * @author caihuafeng
 5  */
 6 include_once(‘inc.php‘);
 7
 8 //定义别名, market\fruit是命名空间,定义market\fruit的别名为mf
 9 use market\fruit as mf;
10 //Warning: The use statement with non-compound name ‘market‘ has no effect in E:\myphp\research\namespace\market\inc_test4.php on line 5
11
12 //由于上面声明了定义market\Apple的别名为ma,因此下面可以直接用ma代替market\Apple
13 $apple = new mf\Apple(__FILE__);
14 //输出Inner |market\fruit\Apple::__construct|, invoked by file:|E:\myphp\research\namespace\market\fruit\inc_test4.php|
15
16 /*
17 如果将上述$apple = new mf\Apple(__FILE__);修改为$apple = new \mf\Apple(__FILE__);[区别是在mf前面加上了\,如果定义了别名,则在别名前面不需要加上\],将会报如下的错误:
18 Fatal error: Class ‘mf\Apple‘ not found in E:\myphp\research\namespace\market\inc_test4.php on line 9
19 */
20 ?>

inc_test5.php

 1 <?php
 2 /*
 3  * @date 2016-4-8
 4  * @author caihuafeng
 5  */
 6 include_once(‘inc.php‘);
 7
 8 //如果省略后面的as ....,那么,就可以直接用最后一节的文字来fruit代替
 9 use market\fruit;
10
11 //由于上面声明了use market\fruit,下面的实例化用fruit代替market\fruit
12 $apple = new fruit\Apple(__FILE__);
13 //输出Inner |market\fruit\Apple::__construct|, invoked by file:|E:\myphp\research\namespace\market\fruit\inc_test5.php|
14 ?>

inc_test6.php

 1 <?php
 2 /*
 3  * @date 2016-4-8
 4  * @author caihuafeng
 5  */
 6 include_once(‘inc.php‘);
 7
 8 //如果省略后面的as ....,那么,就可以直接用最后一节的文字来Apple代替
 9 use market\fruit\Apple;
10
11 //由于上面声明了use market\fruit,下面的实例化用fruit代替market\fruit
12 $apple = new Apple(__FILE__);
13 //输出Inner |market\fruit\Apple::__construct|, invoked by file:|E:\myphp\research\namespace\market\fruit\inc_test6.php|
14 ?>

b.测试二

E:\myphp\research\namespace\demo.php

 1 <?php
 2 /*
 3  * @date 2016-4-8
 4  * @author caihuafeng
 5  * 命名空间下直接new该命名空间中的class名称,可以省略掉use语法,这是php按脚本书写顺序执行导致的。例如如下代码是可以运行的
 6  */
 7  namespace DemoTest;
 8      class Demo {
 9          public function __construct() {
10          echo "this is a test script\n";
11      }
12 }
13
14 namespace DemoNameSpace;
15 class Demo {
16     public function __construct() {
17         echo ‘This is namespace of PHP demo ,The Demo magic constant "__NAMESPACE__" is ‘.__NAMESPACE__ . "\n";
18     }
19 }
20 /*
21 同一脚本下new一个没有指定use哪个命名空间时,会顺着该脚本,使用最靠近new语句之前的一个命名空间中的class
22 下面一行相当于$Demo = new \DemoNameSpace\Demo();
23 */
24 $Demo = new Demo();
25
26 //调用DemoTest空间的Demo类
27 use DemoTest\Demo as d;
28 $d = new d();
29
30 /*
31 输出
32 This is namespace of PHP demo ,The Demo magic constant "__NAMESPACE__" is DemoNameSpace
33 this is a test script
34 */
35
36 /*
37 这个结果表明,同一脚本下new一个没有指定use哪个命名空间时,会顺着该脚本,使用最靠近new语句之前的一个命名空间中的class
38 */
39 ?>

延伸阅读:
PHP 在 5.3.0 以后的版本开始支持命名空间。
http://zhidao.baidu.com/question/401496650

php use php namespace 到底是怎么一回事
http://zhidao.baidu.com/question/506941048

php namespace use include
http://www.baidu.com/s?wd=php%20namespace%20use%20include

PHP中的命名空间(namespace)及其使用详解
http://blog.jjonline.cn/phptech/154.html

PHP命名空间(Namespace)的使用详解
http://www.cnblogs.com/kuyuecs/p/3556421.html

thinkphp use 加载文件
http://www.baidu.com/s?wd=thinkphp%20use%20加载文件

PHP命名空间动态访问及使用技巧
http://www.jb51.net/article/53856.htm

php namespace与use的问题
http://bbs.csdn.net/topics/390727877

http://www.baidu.com/s?wd=php%20namespace
http://www.sogou.com/web?query=php%20namespace
http://www.sogou.com/web?query=php%20namespace

时间: 2024-08-21 07:19:05

PHP命名空间namespace使用小结的相关文章

PHP中的命名空间(namespace)及其使用详解

PHP中的命名空间(namespace)及其使用详解 晶晶 2年前 (2014-01-02) 8495次浏览 PHP php自5.3.0开始,引入了一个namespace关键字以及__NAMESPACE__魔术常量(当然use关键字或use as嵌套语句也同时引入):那么什么是命名空间呢?php官网已很明确的进行了定义并形象化解释,这里直接从php官网copy一段文字[来源]. “什么是命名空间?从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这种抽象概念.例如,在操作系统中目录

Atitit &#160;深入理解命名空间namespace &#160;java c# php js

Atitit  深入理解命名空间namespace  java c# php js 1.1. Namespace还是package1 1.2. import同时解决了令人头疼的include1 1.3. 在不支持ns的语言里面使用ns,前缀发1 1.4. 常用命名空间的统计(约150个)1 1.5. 命名空间2 1.5.1. 在struts2中2 1.6. Linux 就支持6种不同类型的命名空间.2 1.1. Namespace还是package 1.2. import同时解决了令人头疼的in

命名空间 namespace

;命名空间 namespace 假如很多人使用你写的类可以用namespace包起来,有文件中定义命名空间 cpp中使用命名空间 using namespace ..;这样函数或者变量自动加作用域了 iostream在.h 写的命名空间把一些函数变量都包起来了,然后引进来使用using namespcase使用命名空间

PHP命名空间(Namespace)的使用详解

对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只要避免命名重复就可以解决,最常见的一种做法是约定一个前缀. 例:项目中有两个模块:article和message board,它们各自有一个处理用户留言的类Comment.之后我可能想要增加对所有用户留言的一些信息统计功能,比如说我想得到所有留言的数量.这时候调用它们Comment提供的方法是很好的

PHP 使用命名空间(namespace),实现自动加载

示例: #/DB/MySql.class.php也就是DB文件夹下有MySql.class.php文件 namespace DB; class MySql { public function __construct() { var_dump(__FILE__); } } #/index.php namespace Home; use DB\MySql; $mysql = new MySql(); 报错 Fatal error: Class 'DB\MySql' not found in D:\l

struts2 命名空间 namespace 学习

默认的命名空间" namespace="" ", 根命名空间 " namespace="/" ". <package name="test" extends="struts-default"> ,如果未指定命名空间,则命名空间默认为 " namespace="" ". 默认命名空间里的Action可以处理任何命名空间下的Action请求

PHP命名空间(Namespace)的使用详解(转)

对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只要避免命名重复就可以解决,最常见的一种做法是约定一个前缀. 例:项目中有两个模块:article和message board,它们各自有一个处理用户留言的类Comment.之后我可能想要增加对所有用户留言的一些信息统计功能,比如说我想得到所有留言的数量.这时候调用它们Comment提供的方法是很好的

php命名空间(namespace)内如何使用系统类

作者:ffsystem 使用命名空间,可以更方便的组织代码,以及代码复用.新写的一个项目引入了命名空间. 简介:使用namespace,使用__autoload自动导入类. 今天将以前的一段代码,加入到新项目时,出现了奇怪的问题: 代码中有一行: $this->db=new mysqli(***); 错误提示: Warning: require(FFSystem/mysqli.php): failed to open stream: No such file or directory in **

PHP 命名空间(namespace)

1 命名空间综述 在C#和Java中都有命名空间的概念,而在PHP中,命名空间在PHP 5.3版本中首次加入的,以前的版本没有这个功能. 1.1 为什么要使用命名空间? 做项目时,一个文件可能会引入多个文件.如果不使用命名空间,引入的多个文件中可能存在同名的类.函数.常量,就会报错(重复定义的错误). 以函数为例,演示如下: 1.1.1 不使用命名空间: 运行结果: 1.1.2 使用命名空间: 只在上述代码中修改b.php文件,如下: 再次访问,则不会报错,运行结果: 1.2 使用命名空间 优势