Blogger Information
Blog 43
fans 1
comment 0
visits 33968
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP的命名空间
蔚蓝世纪
Original
697 people have browsed it

在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.类文件的自动加载虽然在嵌套时需要创建多个文件,但是对于后期的数据维护与更新,却是简洁方便的。

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:命名空间, 就是全局成员的工作单位, 所在的公司, 这样就好理解了
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post