Blogger Information
Blog 55
fans 3
comment 0
visits 54527
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
命名空间和自动加载
王佳祥
Original
593 people have browsed it

命名空间和自动加载

一、命名空间基础

  • 全局成员:写在函数外部的东西

  • 全局成员有四个:函数,常量,类,接口

  • 全局成员最大特点:不能重复命名

  • namespace关键字来定义命名空间

  1. <?php
  2. //命名空间A
  3. namespace A;
  4. //接口
  5. interface iTest
  6. {
  7. public function getSite();
  8. }
  9. //类
  10. class Demo implements iTest
  11. {
  12. public function getSite()
  13. {
  14. return 'php中文网';
  15. }
  16. }
  17. //函数
  18. function f1(iTest $obj){
  19. return $obj->getSite();
  20. }
  21. //输出
  22. echo '函数输出'.f1(new Demo).'<br>';
  23. echo '类输出'.(new Demo)->getSite().'<hr>';
  24. /*———————————————————————————————————————————————————————————————————————————————— */
  25. //命名空间B
  26. namespace B;
  27. //在B命名空间中访问A命名空间中的类方法
  28. echo '命名空间B调用getSite()方法'.(new \A\Demo)->getSite().'<br>';
  29. //调用函数
  30. echo \A\f1(new \A\Demo);


  • 查看类全名用双冒号::
  1. <?php
  2. namespace one
  3. {
  4. class Demo
  5. {
  6. public function getSite()
  7. {
  8. return 'php中文网';
  9. }
  10. }
  11. }
  12. /*************************************************************************/
  13. namespace two
  14. {
  15. echo (new \one\Demo)->getSite().'<br>';
  16. //查看当前类全名
  17. echo '当前类全名:'.two::class.'<br>';
  18. echo '查看one的类全名:'.\one\Demo::class.'<br>';
  19. class D{}
  20. echo D::class;
  21. }
  22. /*************************************************************************/
  23. //全局匿名空间
  24. namespace
  25. {
  26. //因为有了全局匿名空间,那么全局成员的声明就不应该放在全局,而应该放在空间中
  27. //因此,全局空间应该主要写对全局对象的调用
  28. echo '<br>'.(new one\Demo)->getSite();
  29. }
  30. /*************************************************************************/


  • 如果调用的函数与系统内置的函数重名,则优先调用当前空间的函数
  1. <?php
  2. //在空间中访问类与访问函数有什么区别
  3. namespace one
  4. {
  5. //访问类
  6. echo \Test::NAME.'<hr>';
  7. function var_dump($name)
  8. {
  9. echo 'HELLO 你好?****'.$name;
  10. }
  11. //如果调用的函数与系统内置的函数重名,则优先调用当前空间的函数
  12. //只有在当前空间找不到这个函数,再到全局中去找
  13. var_dump(\Test::NAME);
  14. echo '<br>';
  15. \var_dump(\Test::NAME);
  16. }
  17. //全局
  18. namespace
  19. {
  20. class Test
  21. {
  22. const NAME = 'PHP中文网';
  23. }
  24. }


  • 命名空间的别名
  1. <?php
  2. //命名空间的别名
  3. namespace one;
  4. class Demo{}
  5. /**********************************************************/
  6. namespace two;
  7. class Demo{}
  8. /**********************************************************/
  9. namespace three;
  10. //访问one::Demo
  11. //从全局空间开始访问,完全限定名称的类
  12. echo \one\Demo::class.'<br>';
  13. //类名可以省略掉与当前空间名称重复的部分
  14. //限定名称的类:不从全局空间开始访问
  15. echo A\Hello::class,'<br>';
  16. class Work{}
  17. //3.访问当前空间中的类成员,不要添加空间名称
  18. //非限定名称的类:Work
  19. echo Work::class.'<br>';
  20. echo \one\Demo::class.'<br>';
  21. //使用空间或类的别名来简化这种调用
  22. //空间级的别名:给空间起个别名,使用关键字use
  23. //主要是针对完全限定名称的类起的别名
  24. use \one as I;
  25. echo '别名访问:'. I\Demo::class,'<br>';
  26. //2.类级的别名,给完全限定名称的类起个别名
  27. use \two\Demo as R;
  28. echo '别名访问:' .R::class.'<br>';
  29. //如果别名和类名相同,可以省略as后面的别名
  30. //use \one\Demo as Demo;
  31. //use \one\Demo;
  32. //如果当前类中也有一个与之同名的非限定的类,就不能省略别名
  33. class Demo{}
  34. use \one\Demo as em;
  35. echo '别名访问:' .em::class;
  36. /**********************************************************/
  37. namespace three\A;
  38. class Hello{}
  39. //完全限定名称:从全局空间开始,前面总是由一个"\"
  40. //限定名称:类名总是会有一个或者多个空间名称,但不是从全局开始
  41. //非限定名称:就是不带有空间名称的类


二、类的自动加载

  • spl_autoload_register():注册给定的函数作为 __autoload 的实现
  1. spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] ) : bool
参数 描述
autoload_function 欲注册的自动装载函数。如果没有提供任何参数,则自动注册 autoload 的默认实现函数spl_autoload()。
throw 此参数设置了 autoload_function 无法成功注册时, spl_autoload_register()是否抛出异常。
prepend 如果是 true,spl_autoload_register() 会添加函数到队列之首,而不是队列尾部。
  1. <?php
  2. //__DIR__
  3. //echo __DIR__,'\\demo7.php';
  4. echo __DIR__.'<hr>';
  5. //require __DIR__ . '\\inc\\lib\\Test1.php';
  6. //echo \inc\lib\Test1::class,'<br>';
  7. //str_replace(目标值,替换值,执行替换的数组或者字符串,替换次数)
  8. $path = str_replace('\\',DIRECTORY_SEPARATOR,'\inc\lib\Test1');
  9. echo DIRECTORY_SEPARATOR.'<br>';
  10. echo $path.'<hr>';
  11. require __DIR__ .$path .'.php';
  12. //echo __DIR__ . $path . '.php';
  13. echo Test1::class;
  1. <?php
  2. //类的自动加载
  3. try{
  4. spl_autoload_register(function($class){
  5. $path = str_replace('\\',DIRECTORY_SEPARATOR,$class);
  6. $file = __DIR__ . $path.'.php';
  7. if(!(is_file($file) && file_exists($file)))
  8. throw new \Exception('不是文件或文件不存在');
  9. require $file;
  10. });
  11. }catch(Exception $e){
  12. die($e->getMessage());
  13. }
  14. use inc\lib\Test1;
  15. use inc\lib\Test2;
  16. use inc\lib\Test3;
  17. echo Test1::class.'<br>';
  18. echo Test2::class.'<br>';
  19. echo Test3::class.'<br>';


三、学习总结

  • 用namespace关键字来定义命名空间

  • 命名空间分为完全限定名称,限定名称和非限定名称

  • 完全限定名称:从全局空间开始,前面总是由一个”\”

  • 限定名称:类名总是会有一个或者多个空间名称,但不是从全局开始

  • 非限定名称:就是不带有空间名称的类

  • 别名的使用:use 命名空间名称 as 自定义名称

  • 类的自动加载:用spl_autoload_register()函数

  • 对类的自动加载有了初步认识,就是sql_autoload_register()这个函数有点难理解,不知道这个$class这个变量的值具体是怎么赋值的,我的理解是使用use时把命名空间名称赋值给$class

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
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!