对名空间命的解释:
命名空间使用的关键字是namespace其主要目的就是为了代码复用,那么代码复用为什么会要用到命名空间呢?原因是因为类,函数,常量都是全局有效,包括在函数中也可以直接使用,因此,在全局中不允许有重名的类,函数和常量。如果想从外部导入一个函数库或类库,他们的函数名,类名极有可能与当前脚本冲突,所以,必须要有一套对于工作在全局范围内的脚本成员,进行标识符命名冲突处理的机制。命名空间就是这样一套解决方案,他不仅可以让用户为全局成员起一个较短的名称,又解决了第三方资源的引入带来的重名问题。
案例一:最基础的命名空间的使用案例,用大括号语法实现在一个脚本中创建多个命名空间并访问成员:
<?php //命名空间 // 用大括号语法实现在一个脚本中创建多个命名空间并访问成员 namespace One { class A { const SITE = "PHP后台管理"; public $name = "php"; public function show() { return "空间One的方法:"; } } } namespace Two { class A { const SITE = "JavaScripe"; public $name = "中文网"; public function hello() { return "空间Two的方法:"; } } //在Two空间下调用本空间内的常量 echo A::SITE.'<br>'; //在Two空间下调用One空间内的属性 echo (new \One\A())->name.'<br>'; //在Two空间下调用One空间内的常量 echo \One\A::SITE.'<br>'; //输出One空间下的函数 echo (new \One\A())->show().'<br>'; //输出当前空间的名字 echo '当前命名空间是: '.__NAMESPACE__.'<br>'; } namespace { //在全局空间下调用One空间内的常量 echo (new \One\A())->name.'<br>'; } ?>
说明:命名空间的关键字是namespace,namespace之前不能有除了declare和注释之外的任何代码,html也不行,如果当前脚本声明了命名空间,则所有成员的访问,就必须使用命名空间,包括系统函数;在不同空间内调用其他空间的类中的函数或方法需要加上对应空间的路径,值得注意的是,在没有使用任何命名空间的情部下,所有类,常量,函数全部声明在全局空间,用\表示,如果没有明确定义某个空间,那么就是默认在全局空间下,另外在声明类,常量,函数的时候,前面不需要添加\,调用的时候才需要添加\;还有一点是,在全局不允许重复声明类,常量与函数。
案例二:使用use 导入其它脚本中的类/常量/函数,并使用别名方式访问:
<?php namespace One { class A { const SITE = "PHP后台管理"; public $name = "php"; public function show() { return "空间One的方法:"; } } } namespace Two { class A { const SITE = "JavaScripe"; public $name = "中文网"; public function hello() { return "空间Two的方法:"; } } }
<?php //使用use 导入其它脚本中的类/常量/函数,并使用别名方式访问 namespace Three { include 'demo2.php'; //通过use使用空间One use \One\A as A1 ; class A { public function show() { return '空间C的方法'; } } //在空间Three中使用空间One中的常量 echo A1::SITE.'<br>'; //在空间Three中使用空间One中的方法 echo (new A1())->show().'<br>'; //在空间Three中使用空间One中的属性 echo (new A1())->name.'<br>'; } ?>
说明:use关键字导入一个命名空间,结合include,require等把相应文件包涵进来可以达到跨文件调用不同命名空间中类的目的,同时使用关键字as 可以使调用不同空间中的类中函数或方法时使代码更加的简洁直观。
问答:非限定名称,限定名称和完全限定名称的命名空间之间的区别与联系是什么?
答:我的理解是可以把它和文件访问的思路去考虑,非限定名称就是在当前自己的命名空间下访问自己类的函数或方法,不需要加上命名空间的前缀,而限定名称就是在A命名空间中访问B空间下类的函数或方法,此时就需要先表明你要在哪个空间下找,要不然系统是找不到的,而完全限定名称其实包含了他们任何的使用情况,就是直接在前边加上绝对路径,其实他是包涵非限定和限定的,但是有时候是不需要完全限定名称的,要在合理的情况下使用各种方式,才不会有画蛇添足的情况出现