/*
* 命名空间的声明与使用
* 1.使用关键字:namespace
* 2.php5.3+
* 3.namespace 之前不能有除了declare和注释之外的任何代码,html也不行
* 4.命名空间默认从全局开始定位,全局空间用\表示,类似于根目录
* 5.如果当前脚本声明了命名空间,则所有成员的访问,就必须使用命名空间,包括系统函数
*/
<?php /* * 1.声名一个命名空间:test 下创建 demo1类 get() 函数 */ namespace test; class demo1{ function show() { return '这是test命名空间下demo1类的show方法'; } const TEYP = 'PHP'; } function get() { return 'test下面的get方法'; } /* * 2.一个脚本中创建多个命名空间:test1 下也创建 demo1类 get() 函数 */ namespace test1; class demo1{ function show() { return '这是test1命名空间下demo1类的show方法'; } const TEYP = 'javascript'; } function get() { return 'test1下面的get方法'; } //默认输出当前空间的内容 echo '默认输出当前test1空间的show()方法'.(new demo1())->show().'<br>'; echo get(),'<br>'; //当前空间 echo '当前的命名空间:'. __NAMESPACE__.'<br>'; //也可以带上当前的命名空间来访问当前空间代码 $namespace = __NAMESPACE__.'\demo1'; echo (new $namespace)->show().'<br>'; //输出test空间下的的内容,带上\从根目录开始 // 专业术语:完全限定名称 echo \test1\get().'<br>'; echo demo1::TEYP,'<hr>'; /* * 3.跨空间访问代码:跨空间访问和跨目录访问文件是一样的,都要带上完整的空间路径 */ echo \test\demo1::TEYP.'<br>'; echo \test\get().'<br>'; echo \test\demo1::class.'<br>'; echo (new \test\demo1())->show().'<hr>'; echo namespace\get().'<br>'; /* * 4.在命名空间的脚本中,如何访问系统预定的函数? * 例如声明一个变量 $string; */ $string = '北京欢迎你!'; print_r($string); \print_r($string); echo '<hr>'; //之前我们说过在空间里访问全局空间的代码要加\,这里没有加为什么可以? //因为如果用户没有\,计算机首先会在本空间查找var_dump()函数,如果没有找到就会去全局空间查找,所以不报错; //如果用户在当前空间也创建了一个var_dump()函数,则只会执行本空间定义的,不会执行系统预定义的 function print_r($string) { echo $string; } print_r('这是test1空间的print_r函数'); echo '<hr>'; //事实上2个完成的调用语句应该这样写 \print_r($string);//系统预定义函数 echo '<br>'; \test1\print_r('test1空间的print_r函数');
点击 "运行实例" 按钮查看在线实例
/*
* 如何让全局代码和用户自定义命名空间的代码和平共处
* 1.全局代码:之前我用/表示
* 2.用户代码:用namespace进行标识
* 3.用户自定义命名空间:空间标识符后又一对花括号,属于该空间的代码都放里面
* 4.全局空间代码:使用一个没有标识符namespace 关键字后面跟一对花括号即可,将代码放在这对没有标识符的括号里面
*
*/
<?php //声名一个命名空间test3 namespace test3{ class demo2 { const HOST = '127.0.0.1'; } function set() { return 'test3\set方法'; } } //如果当前脚本使用了命名空间,那么里面的代码必须使用命名空间进行声名和访问 // echo (new \test3\demo2())->name;//不能访问 //声名一个命名空间test4 namespace test4{ class demo2 { const HOST = 'localhost'; public $name='php'; } function set() { return 'test4\set方法'; } //在test4空间如果访问test3空间的代码是不可以的 //echo (new \test3\demo2())->name; echo (new demo2())->name.'<br>'; } //全局命名空间 namespace { //默认全局全局空间,不用加\ echo test3\demo2::HOST.'<br>'; echo test4\set().'<br>'; }
点击 "运行实例" 按钮查看在线实例
/**
* 命名空间的分层管理
* 非限定名称:空间成员名称前不适用空间前缀,类似当前目录访问
*/
<?php namespace test; class demo1{ function show() { return '这是test命名空间下demo1类的show方法'; } const TEYP = 'PHP'; public $name='php'; } function get() { return 'test下面的get方法'; } //非限定名称: echo get().'<br>'; //限定名称:类似相对路径 自动添加前缀test echo '限定名称:'.(new test1\demo1)->name,'<br>'; //声名一个命名空间test1 为test的子类 namespace test\test1; class demo1{ function show() { return '这是test命名空间下demo1类的show方法'; } const TEYP = 'PHP'; public $name='php'; } function get() { return 'test下面的get方法'; } //完全限定名称:相当于绝对路径 echo (new \test\demo1())->show();
点击 "运行实例" 按钮查看在线实例
/**
* 使用别名导入命名空间
* 使用关键字use
*/
<?php namespace test; //别名导入子命名空间 use test\one\model as model; //别名导入子命名空间下的类 use test\view\demo4 as demo; class demo4{ public $name = 'php中文网'; const TYPE = 'string'; } function add($a,$b) { return $a+$b; } echo 'test空间下的方法:'.add(20,30); echo 'test\one\model空间下的类属性:'.(new model\demo4())->name.'<br>'; echo 'test\one\model空间下add方法:'.model\add(10,15).'<br>'; echo 'test\view空间下类的常量:'.demo::TYPE; //声名一个子命名空间 namespace test\one\model; class demo4{ public $name = 'mysql'; const TYPE = 'int'; } function add($a,$b) { return $a*$b; } namespace test\view; class demo4{ public $name = 'javascript'; const TYPE = 'varchar'; } function add($a,$b) { return $a/$b; }
点击 "运行实例" 按钮查看在线实例