命名空间
在php语言里面,语法规则同名的函数、类名、常量在一个请求里不允许出现多次,如果有的程序不得以必须出现同名的函数、类名、常量,可以吧它们放到不同的空间里面做请求,这个空间就是命名空间
命名空间针对函数、类名、常量起作用,统称为元素
常量声明
define(key,val);//忽略命名空间
const key=val; //受命名空间影响
访问元素
- 默认当前空间(挨着最近的空间)(非限定名称)
- 访问其他空间的元素 空间名元素(完全限定名称)
- 访问当前空间子空间的元素 当前空间子空间名元素 (限定名称) 当前空间和子空间名拼接
引入机制(降低空间书写复杂度)
空间引入
use a\b\c\d;
echo d\fun(); //通过限定名称方式访问(限定名称是引入空间名的最后一级名称)
元素引入(只能引入类)
use a\b\c\d\类名;
echo 类名::$name; //非限定名称访问
如果当前空间有元素和引入的元素重名,应该给引入的元素起别名
use a\b\c\d\类名 as 类名X;
echo 类名X::$name; //非限定名称访问
公共空间(无namespace关键字)
- 在有命名空间的设置的程序中访问用 元素
- 通过非限定方式访问:先找当前空间元素(没有再找公共空间)
注意
- 第一个namespace前面不能有任何代码(header也要写在下面)
- 命名空间名称可以重复,但是同名空间里不能有同名元素
例子
<?php
//namespace 空间名
namespace space1;
const USER='root';
function a(){
echo 'a';
}
namespace space2;
const USER='admin';
function a(){
echo 'b';
}
//默认当前空间(挨着最近的空间)
a();
echo USER;
//访问其他空间的元素
\space1\a();
echo \space1\USER;
echo '<hr>';
//多级空间
namespace xian\yanta\yuhua;
class stu{
public $name='xiaobai';
static $age='12';
}
namespace xianyang\liquan\junma;
class stu{
public $name='xiaohei';
}
//访问当前空间
$stu=new stu();
echo $stu->name;
//访问其他空间
$stu=new \xian\yanta\yuhua\stu();
echo $stu->name;
echo '<hr>';
namespace d1;
function e(){
echo 'e';
}
namespace d2\a;
function e(){
echo 'e2';
}
namespace d2;
function e(){
echo 'e1';
}
//1.非限定名称
e();
//2.完全限定名称
\d1\e();
//3.限定名称(自动拼接空间名)
a\e();
echo '<hr>';
//空间引入
use xian\yanta\yuhua; //引入空间
$stu=new yuhua\stu(); //限定名称方式访问
echo $stu->name;
echo '<hr>';
//元素引入(仅类)
use xian\yanta\yuhua\stu;
echo stu::$age; //非限定名称访问
?>
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。