命名空间是PHP为了解决重名问题推出的机制,密码空间可以认为地将内存进行分隔,让不同内存区域的同名结构得以共存,类似操作系统中文件夹的概念
基础语法:namespace space_name;
一个文件中可以声明多个命名空间,但实际开发往往只会定义一个,第一次声明的命名空间必须在所有代码之前
类似子文件夹的概念,可以在一个命名空间下面创建一个子空间:namespace space\son_space1;
同时子空间下还可以创建下一级子空间:namespace space\son_space1\son_space2;
所有定义的命名空间的顶级空间,所有未定义命名空间的脚本都位于全局空间中
所有空间本质上都是在全局空间中划分出来的
所有系统常量、系统函数、系统类都属于全局空间下的
在命名空间中,使用非限定名称方式访问空间成员时,首先会在当前空间内查找,如果找不到,会去全局空间查找该成员是否是系统常量或系统函数,不会查找系统类。
4.1、非限定名称访问:直接访问当前空间内成员
4.2、限定名称访问:用于访问当前空间子空间的成员,在元素前使用空间名字+\来访问
4.3、完全限定名称访问:从全局空间(相当于根目录,用\表示)开始写路径,相当于绝对路径
后两种访问方式只能访问空间中的常量,函数和类
<?php //第一个声明的命名空间之前不能有其他代码 namespace p2; function a(){ echo $a.‘p2<br>‘; } namespace p1\s1; class A{ function __construct(){ echo ‘s1<br>‘; } } namespace p2\s2; const A = ‘s2‘; namespace p1; function a(){ echo ‘p1<br>‘; } //非限定名称访问 a(); //p1 //限定名称访问 new s1\A(); //s1 //完全限定名称访问 echo \p2\s2\A; //s2 //非限定名称访问系统常量 echo __FILE__.‘<br>‘; //非限定名称访问系统函数 echo time().‘<br>‘; //非限定名称访问系统类 //new mysqli(); //报错 new \mysqli(); //必须使用完全限定名称访问
5、命名空间引入
为了减少复杂的完全限定名称访问,可以将其他空间的成员(类、函数、常量)引入到当前空间,从而直接使用非限定名称访问
引入方式,使用use关键字:
namespace s1; class Man{} function f(){} const PI = 3.14; namespace s2; //引入类 //use s1\Man; new Man(); //引入函数 //use function s1\f; f(); //引入常量 //use const s1\PI; echo PI; //一次性引入 // use s1\{ // Man, // function f, // const PI // };
注意:使用use进行空间引入时,默认从全局空间开始构建路径,即不以\符号开头的路径会在路径开头自动加上\符号,以上代码 use s1\Man;等价于use \s1\Man;
重名问题:
如果存在重名,则在use语句后面加上as 别名:use s1\Man as alias;
namespace s1; class Man{} const PI = 3.14; namespace s2; class Man{} const PI = 3.14159; use s1\{ Man as M, const PI as PI1 }; new M();
引入空间: use spacename; 引入的空间可看作当前空间的子空间
namespace s1; class Man{} function f(){} const PI = 3.14; namespace s2; use s1; new s1\Man(); s1\f(); echo s1\PI;
原文:https://www.cnblogs.com/chuanzi/p/10385646.html