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