php中的命名空间
qingheluo2021-01-31清河洛830
PHP命名空间(namespace)是在PHP5.3中加入的,可以解决以下两类问题:1、用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。2、为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。使用namespace关键字定义命名空间定义命名空间的语法格式语法格式1:namespace 命名空间1;
...
namespace 命名空间2;
...
直到下一个namespace语句之前的所有代码都属于该命名空间
语法格式2:namespace 命名空间1{...}
namespace 命名空间2{...}
...
PHP命名空间(namespace)是在PHP5.3中加入的,可以解决以下两类问题:
1、用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
2、为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
使用namespace关键字定义命名空间
定义命名空间的语法格式
语法格式1:
namespace 命名空间1;
...
namespace 命名空间2;
...
直到下一个namespace语句之前的所有代码都属于该命名空间
语法格式2:
namespace 命名空间1{...}
namespace 命名空间2{...}
当一个文件中有多个命名空间时推荐使用语法格式2
如果一个文件中有全局的命名空间,只能使用语法格式2(大括号形式),全局代码用一个不带名称的namespace语句
namespace 命名空间1{...}
namespace {...//全局代码}
1、命名空间可以有多个层级,各个层级之间使用反斜杠""分隔(one\two\three...)
2、在声明命名空间之前唯一合法的代码是declare(encoding="")语句,其他所有非PHP代码包括空白符都不能出现
<html>
<?php
$name='qingheluo';
namespace Myjob\Myname\info;
?>
命名空间前出现了非php代码"<html>",会致命错误
命名空间前出现了非declare语句的php代码"$name='qingheluo'",会致命错误
常量__NAMESPACE__表示当前命名空间名称的字符串
命名空间的使用
1、非限定名称,不包含命名空间前缀,如new foo()
会解析为该代码所在命名空间
如果在改代码所在命名空间没有找到指定类或变量,会被解析为全局类或变量
2、限定名称,使用相对路径形式的命名空间前缀,如new mynamespace\foo()
会在命名空间之前加上该代码所在命名空间
3、完全限定名称,使用绝对路径形式的命名空间前缀,如new \mynamespace\foo()
会在全局中寻找指定命名空间
使用new \foo()表示全局命名空间中的类或变量
命名空间的导入和别名
如果命名空间很长那么会给编写和阅读带来困扰,我们可以使用别名来缩短过长的命名空间
php命名空间可以定义命名空间、类名和函数名的别名
在命名空间内引入其他文件不会属于本命名空间,而属于公共空间或是文件中本身定义的命名空间
use关键字用来定义命名空间和类名的别名
use Myjob\Myname\info as new_Name
use Myjob\Myname\info\ClassName as new_ClassName
use function关键字用来定义函数的别名
use function Myjob\Myname\info\func_name as new_func_name;
as语句可以省略,表示使用最后一个名称作为别名
use Myjob\Myname\info等同于
use Myjob\Myname\info as info
use Myjob\Myname\info\ClassName等同于
use Myjob\Myname\info\ClassName as ClassName
use function Myjob\Myname\info\func_name等同于
use function Myjob\Myname\info\func_name as new_func_name;
一行use语句可以定义多个别名
use Myjob\Myname\info,Myjob\Myname\info\ClassName,...
导入操作是在编译执行的,动态的类名和函数名则不是
use Myjob\Myname\info\ClassName as Myclass
$obj = new Myclass; //实例化一个Myjob\Myname\info\ClassName对象
$a = 'Myclass';
$obj = new $a; //实际化一个Another对象
导入操作只影响相对路径和无路径。完全限定名称由于是确定的,故不受导入的影响。
use Myjob\Myname\info\ClassName as Myclass
$obj = new \Myclass; // 实例化Myclass类
关键字namespace可用来显式访问当前命名空间中的元素
<?php
namespace Myjob;
use Other\obj as mine;
mine\mine(); //调用函数 Other\obj\mine()
namespace\obj\mine(); //调用函数 Myjob\obj\mine()
?>