博客列表 >PHP的命名空间

PHP的命名空间

蔚蓝世纪
蔚蓝世纪原创
2020年05月14日 08:42:43691浏览

在PHP中,函数、类和常量都是不允许同名的,一旦同名就会出现错误。但是在大型项目开发中,不同团队负责的模块可能不同,那么就很难避免出现同名结构,所以“命名空间”就产生了,“命名空间”保证了即使出现了同名结构,也不会影响到整个项目。

一、命名空间定义:命名空间是指人为的将内存进行分隔,让不同内存区域的同名结构共存。从而解决在大型本项目中可能出现的重名结构问题。

二、命名空间语法:namespace + 空间名字

三、命名空间的访问方法

  1. 非限定名称访问:成员前面不能有任何的命名空间,不能有“\”,理解成文件当前路径,如:echo Human::PERSON_NAME
  2. 限定名称访问:成员名称前面至少要有一个命名空间,至少要有一个反斜线“\”,且不能在首位,理解成相对路径。限定名称的访问是基于子空间来实现的,如 echo space2\Human::PERSON_NAME
  3. 完全限定名称访问:这个访问方式是默认的,用的最多的。访问总是从根空间(即全局空间)开始访问,第一个字符一定是反斜线(“\”),可以将完全限定名称访问理解成绝对路径,使用“\”作为全局空间开始符号。 echo \space3\Human::PERSON_NAME

代码举例:

  1. namespace space1;
  2. echo __NAMESPACE__ . '<br>';
  3. class Human
  4. {
  5. const PERSON_NAME = '王小丁';
  6. }
  7. //1.非限定名称
  8. echo Human::PERSON_NAME;
  9. echo '<hr>';
  10. //2.限定名称
  11. namespace space;
  12. echo space2\Human::PERSON_NAME . '<br>';
  13. namespace space\space2;
  14. echo __NAMESPACE__ . '<br>';
  15. class Human
  16. {
  17. const PERSON_NAME = '王小丁';
  18. }
  19. //3.完全限定名称(默认的,用的最多的)
  20. echo '<hr>';
  21. namespace space3;
  22. echo __NAMESPACE__ . '<br>';
  23. class Human
  24. {
  25. const PERSON_NAME = '王小丁';
  26. }
  27. echo \space3\Human::PERSON_NAME;

输出效果:

四、命名空间的别名与类别名

PHP 命名空间支持有两种使用别名或导入方式:为类名称使用别名,或为命名空间名称使用别名。
代码举例:

  1. //1.命名空间的别名
  2. namespace myspace1;
  3. class C1
  4. {
  5. //...
  6. }
  7. echo \myspace2\C2::index(),'<br>';
  8. echo \myspace2\C3::cate(),'<hr>';
  9. namespace myspace2;
  10. class C2
  11. {
  12. public static function index()
  13. {
  14. return '首页';
  15. }
  16. }
  17. class C3
  18. {
  19. public static function cate()
  20. {
  21. return '频道页';
  22. }
  23. }
  24. namespace myspace3;
  25. //use 用来声明空间别名,use默认就是从根空间开始
  26. //给外部的空间起了一个别名,myspace2 ===> s
  27. use myspace2 as s;
  28. echo s\C2::index(),'<br>';
  29. echo s\C3::cate(),'<hr>';
  30. //2.类级的别名
  31. //给外部空间中的类,起一个别名
  32. // use myspace2\C2 as C2;
  33. // use myspace2\C3 as C3;
  34. // echo C2::index(),'<br>';
  35. // echo C3::cate(),'<hr>';
  36. //类别名与原始类名相同,此时可以省略类别名,虽然可以这样使用,但是建议起上名字
  37. // use myspace2\C2;
  38. //因为当前类中与有一个与之冲突的类名C2
  39. use myspace2\C2 as C;
  40. use myspace2\C3;
  41. echo C2::index(),'<br>';
  42. echo C::index(),'<br>';
  43. echo C3::cate(),'<hr>';
  44. class C2
  45. {
  46. public static function index()
  47. {
  48. return '首页NS-T2';
  49. }
  50. }

输出效果:

五、类文件的自动加载

如果想实现自动加载,需要满足两个条件
1.命名空间必须和类文件所在的绝对路径一一对应
2.当前类名称与当前的类文件的名称完全一致

  1. //封装自动加载器
  2. //需要在同一路径下创建一个或者几个php文件,且需要创建一个autoload.php文件来作引入桥梁
  3. require 'autoload.php';
  4. echo '<hr>';
  5. use inc\lib\Demo1;
  6. use inc\lib\Demo2;
  7. use inc\lib\Demo3;
  8. echo Demo1::say(),'<br>';
  9. echo '<hr>';
  10. echo Demo2::say(),'<br>';
  11. echo '<hr>';
  12. echo Demo3::say(),'<br>';
  13. echo '<hr>';

autoload.php代码举例

  1. try{
  2. spl_autoload_register(function($className){
  3. //1.应该将类名中的命名空间的分隔符转为目录分隔符
  4. $path = str_replace('\\',DIRECTORY_SEPARATOR,$className);
  5. echo $path, '<br>';
  6. //2.生成真正要加载的类文件名称
  7. $file = __DIR__ . DIRECTORY_SEPARATOR .$path .'.php';
  8. echo $file,'<br>';
  9. //3.加载这个文件
  10. require $file;
  11. });
  12. }catch (Exception $e) {
  13. die($e->getMessage());
  14. }

输出效果:

六、总结

1.不同的命名空间里面可以定义同名的函数、类和常量。
2.命名空间里可以书写任意代码。
3.非限定名称访问,直接访问当前目录。
4.限定名称访问,访问的是当前目录的子目录。
5.完全限定名称访问,是从全局即根目录下开始访问。
6.全局空间的元素访问使用完全限定名称访问
7.系统内置的类、函数和常量都属于全局空间。
8.系统函数、常量,在命名空间内访问的时候,系统会自动在自己空间找,如果找不到会到全局空间找。
9.系统类必须使用全局空间访问:\类名
10.命名空间的别名可以简化代码。
11.类文件的自动加载虽然在嵌套时需要创建多个文件,但是对于后期的数据维护与更新,却是简洁方便的。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议