使用namespace的目的php
命名空间将代码划分出不一样的空间(区域),每一个空间的常量、函数、类(为了偷懒,我下边都将它们称为元素)的名字互不影响, 这个有点相似咱们经常提到的'封装'的概念。html
团队合做项目时,避免与团队其它成员新建的类发生冲突;我的负责项目时,避免先后新建的类发生冲突;php框架
据我的理解,用到所须要的类时,须要先require或include引入,因此会发生类重定义的错误的前提是:两个相同命名的类都有被引入。目前有些php框架会自动加载(即include)全部新建的model类,因此为了不你新建的model类和项目框架原生的核心类发生重名冲突,采用了namespace。(想了想,与团队成员新建的类产生冲突应该经过沟通避免,即便事发后也应该从新调整类名即时维护,避免后期形成由于对类的理解混淆而带来维护上的复杂度提升)框架
namespace的使用方法函数
一、namespace后命名的定义不区分大小写;一个PHP文件客房多个命名空间,第一个命名空间前不能有代码;namespace建议用类名ui
二、没有定义命名空间,就理解为使用顶级命名空间。new类时,能够在类前加上反斜杠\,也能够不加。spa
//1.php class Person{ function __construct(){ echo 'I am one!'; } }
//name.php require_once './1.php'; new Person(); //输出 I am one!; new \Person(); //输出 I am one!;
三、 new类时,当前定义了命名空间时,类名必定用反斜杠字符。code
myday.php
<?php
class myday { function mda(){ echo "今天是星期五"; } }
Anlis.php
<?php
namespace one;
require('myday.php'); $day = new \myday();
这是由于当前已经定义了命名空间,若是new时类名不加“\”,它会默认加上one命名空间,会报如下错误:
htm
Fatal error: Class 'one\myday' not found in C:\phpStudy\PHPTutorial\WWW\test\yidian\namespace\Anlis.php on line 5
四、 根命名空间和子命名空间blog
命名空间的调用语法像文件路径同样是有道理的,它容许咱们自定义子空间来描述各个空间之间的关系。当前命名下调用别的命名空间的类时,使用了一种像文件路径的语法: \空间名\元素名(类名)。
固然,也可使article和message board这两个模块其实都是处于同一个blog项目内。若是用命名空间来表达它们的关系,是这样:
<?php //我用这样的命名空间表示处于blog下的article模块 namespace Blog\Article; class Comment { } //我用这样的命名空间表示处于blog下的messageBoard模块 namespace Blog\MessageBoard; class Comment { } //调用当前空间的类 $comment = new Comment(); //调用Blog\Article空间的类 $article_comment = new \Blog\Article\Comment(); ?>
并且,子空间还能够定义不少层次,好比说 Blog\Article\Archives\Date
在命名空间字符串过长时,使用use能够相应的缩短命名空间。
一、new类时,最前面无需用反斜杠。此外,use后没有as时,别名默认为最后一个反斜杠后的内容。
<?php namespace animal\dog; class Life{ function __construct(){ echo 'dog life!<br>'; } } namespace animal\cat; class Life{ function __construct(){ echo 'cat life!<br>'; } }
//没有使用use new Life(); //按照代码执行顺序,这里默认animal\cat这个命名空间;输出:cat life! new \animal\dog\Life(); //输出:dog life! //使用use use animal\dog; new dog\Life(); //输出:dog life! use animal\dog as d; //定义别名:d new d\Life(); //输出:dog life!
使用use和没有使用use区别
(1)、使用了use在当前命名空间下调用别的命名空间的元素,不加“\”也不会默认加上当前命名空间。
(2)、没使用use时,不加“\”也会默认加上当前命名空间。
二、namespace后面不建议加类名,但use能够。
namespace animal\dog; class Life{ function __construct(){ echo 'dog life!'; } } namespace animal\cat; class Life{ function __construct(){ echo 'cat life!'; } } use animal\dog\Life as dog; new dog();//输出:dog life!
如上所示,use后加上类名后,就至关于把类改了个名称:由Life改成dog了。
注:若是上面不用as dog就会报错。由于命名空间cat下也有个同样名称的Life类,能够理解为,使用use后,这个昵称对应的类只能归当前命名空间占有,其它命名空间下不容许存在该类,因此use后加上类名必须加上as才不会报错。
总结:
一、namespace就是划分领域的做用,表明这些东西是属于某个命名空间下的。
二、use就是起小名的做用,不论写起来仍是提及来均可以省很多事儿。