1.编程: 用大括号语法实现在一个脚本中创建多个命名空间并访问成员
实例
<?php // 用大括号语法实现在一个脚本中创建多个命名空间并访问成员 //如何让全局代码与用户空间代码和平相处? //1.全局代码:之前我们是用 \ 进行引用的 //2.用户代码:用 namespace 进行标识 //3.用户自定义命名空间,在空间标识符后有一对花括号代码之前的分号,将属于该空间的代码全部放在花括号内 //4.全局空间的代码,使用一个没有标识符的namespace关键字加花括号即可,将全局代码放在这对没有空间标识符的花括号内 namespace { const app = '我是全局命名空间的常量'; } //声明一个命名空间one namespace one { class Demo { public $name = 'Shawn Wang'; public function demo1() { return __METHOD__; } } const SITE = 'PHP中文网'; function add($a,$b) { return $a+$b; } echo (new \two\Demo())->name,'<br>'; echo (new \two\Demo())->demo1(),'<br>'; echo add(12,88),'<br>'; echo app,'<br>';//访问全局命名空间下的常量 echo \two\add(32,88),'<hr>'; //echo (new \one\Demo())->add(12,88),'<hr>';不明白为何这样会错 } //声明一个命名空间two namespace two { class Demo { public $name = '王先生'; public function demo1() { return __METHOD__; } } const SITE = 'www.php.cn'; function add($a,$b) { return $a+$b; } echo (new \one\Demo())->name,'<br>'; echo (new \one\Demo())->demo1(),'<br>'; echo add(32,88),'<br>'; echo \one\add(32,88),'<hr>'; } //如果执行one空间中的代码 //echo (new \one\Demo())->name,'<br>'; //这样可以吗?貌似可以,但实际不行的 //原因是:如果当前脚本使用了命名空间,那么里面的全部代码都必须使用命名空间进行声明和访问 //声明一个命名空间three namespace three { echo (new \one\Demo())->name,'<br>'; echo (new \two\Demo())->name,'<hr>'; } //声明一个全局空间 namespace { echo (new one\Demo())->name,'<br>'; echo (new \two\Demo())->name,'<hr>'; }
运行实例 »
点击 "运行实例" 按钮查看在线实例
2.编程:使用use 导入其它脚本中的类/常量/函数,并使用别名方式访问
实例
<?php //使用use 导入其它脚本中的类/常量/函数,并使用别名方式访问 //使用别名导入命名空间 //use关键字的使用 //1. 声明一个命名空间one namespace one; //use one\two\three\Demo; //如果当前类也有一个同名的Demo类,怎么办?为导入的类取一个别名 use one\two\three\Demo as Demo1; class Demo { public $name='Shawn Wang'; } const SITE='PHP中文网'; function add($a,$b) { return $a+$b; } //在当前空间访问: one\two\three空间中类,必须要添加很长的空间前缀 //echo (new one\two\three\Demo)->name; echo (new Demo)->name; echo (new Demo1)->name,'<hr>'; //2.声明命名空间:one\two\three namespace one\two\three; class Demo { public $name=''; } const DOMAIN = 'www.php.cn'; function add($a,$b) { return $a+$b; } namespace test1; require 'test2.php'; use test2\Test2;//导入类,类的别名默认为Test2。与当前命名空间类名有冲突的话用as class Test1 { public static function demo() { return __METHOD__; } } echo Test1::demo(),'<hr>'; echo \test2\Test2::demo(),'<hr>'; echo Test2::demo(),'<hr>';
运行实例 »
点击 "运行实例" 按钮查看在线实例
3. 问答: 非限定名称,限定名称和完全限定名称的命名空间之间的区别与联系是什么?
非限定命名称的命名空间: 即当前所在的命名空间
限定名称的命名空间: 即使用命名空间前缀的命名空间
完全限定名称的命名空间: 即使用命名空间前缀的命名空间,且命名空间前缀是以根空间(全局空间)开始的