一.编程: 用大括号语法实现在一个脚本中创建多个命名空间并访问成员
实例
<?php /** * 让全局代码与用户空间代码和平共处 * 1.全局代码:之前我们使用\进行引用的 * 2.用户代码:用namespace进行标识 * 3.用户自定义命名空间,在空间标识符后有一队花括号之前的分号,' * 将属于该空间的代码全部放在花括号内 * 4.全局空间的代码使用一个没有标识符的namespace关键字加花括号即可,将全局代码放在这对没空间标识符的花括号内 * */ //1.声明一个命名空间One namespace One{ class test{ public $name='小黑'; } const COLOR='黑色'; function say($food){ return '她说她喜欢吃'.$food; } } //2.声明一个命名空间Two namespace Two{ class test{ public $name='小白'; } const COLOR='白色'; function say($food){ return '她说她不喜欢吃'.$food; } } //不能够这样写! //因为当前脚本使用了命名空间,应该在全局命名空间内执行 //echo (new \One\test())->name; //如果在一个新的命名空间内执行也是不对的\ //虽然看着是可以,但实际是不行的 namespace Three{ echo (new \One\test())->name; } //声明一个全局空间,全局空间的命名只需要namespace关键字,不需要其他的标识符,不然就是错误 namespace { echo (new \One\test())->name; }
运行实例 »
点击 "运行实例" 按钮查看在线实例
二.编程:使用use 导入其它脚本中的类/常量/函数,并使用别名方式访问
实例
<?php /** * 使用别名导入命名空间\ * use关键字的使用 */ //1.声明一个命名空间Three namespace Three; //use Three\Three_2\Three_3 //如果当前类也有一个同名的demo类,为导入的类取一个别名 use Three\Three_2\Three_3\demo as demo2; include'./demo4.php'; use One\demo as demo3; class demo{ public $name='吕布'; } const TEXT='三国'; function task($name,$task){ return $name.'在'.$task; } //当前命名空间访问:Three\Three_2\Three_3空间中类 //必须添加很长的空间前缀 echo (new Three_2\Three_3\demo())->name; echo '<hr>'; //两个结果相同 echo (new demo2())->name; //引入另一个文件的命名空间One的demo类 echo (new demo3())->name; //声明命名空间Three\Three_2\Three_3 namespace Three\Three_2\Three_3; class demo{ public $name='貂蝉'; } const TEXT2='三国??'; function task2($name,$task){ return $name.'不在'.$task; }
运行实例 »
点击 "运行实例" 按钮查看在线实例
三.问答: 非限定名称,限定名称和完全限定名称的命名空间之间的区别与联系是什么?
1.非限定名称,或不包含前缀的类名称,例如 $comment = new Comment();。如果当前命名空间是Blog\Article,Comment将被解析为Blog\Article\Comment。如果使用Comment的代码不包含在任何命名空间中的代码(全局空间中),则Comment会被解析为Comment。
2.限定名称,或包含前缀的名称,例如 $comment = new Article\Comment();。如果当前的命名空间是Blog,则Comment会被解析为Blog\Article\Comment。如果使用Comment的代码不包含在任何命名空间中的代码(全局空间中),则Comment会被解析为Comment。
3.完全限定名称,或包含了全局前缀操作符的名称,例如 $comment = new \Article\Comment();。在这种情况下,Comment总是被解析为代码中的文字名(literal name)Article\Comment。