博客列表 >php中命名空间与自动加载

php中命名空间与自动加载

Jason
Jason原创
2020年05月09日 21:48:29588浏览

php中namespace于自动加载

namespace中的非限定名称,限定名称

1.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)

2.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。

示例:

  1. namespace 广东\广州;
  2. class Demo
  3. {
  4. const ROAD_NAME='广州路';
  5. }
  6. // 非限定名称,文件当前路径
  7. echo Demo::ROAD_NAME;
  8. echo '<br>';
  9. namespace 广东;
  10. // 限定名称,通常在类空间中,
  11. echo 惠州\Demo::ROAD_NAME;
  12. namespace 广东\惠州;
  13. class Demo
  14. {
  15. const ROAD_NAME='广州路';
  16. }
  17. echo '<br>';
  18. namespace 广东\深圳;
  19. class Demo
  20. {
  21. const ROAD_NAME='广州路';
  22. }
  23. // 完全限定名称,绝对路径
  24. echo \广\广\Demo::ROAD_NAME;
  25. echo '<br>';

输出:

  1. 广州路
  2. 广州路
  3. 广州路

通过结果我们可以看到,同样的类名,同样的方法,如果在一个类中写,这样是不可能的,只有用命名空间,才能实现,这样应用场景就出来了
编写的代码与PHP内部的类/函数/常量/或第三方类/函数常量之间的冲突
这就是他的应用场景

命名空间的别名,与类别名的语法与场景

1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。

  1. namespace ns1;
  2. class T1
  3. {
  4. }
  5. echo \ns2\T2::index(),'<br>';
  6. echo \ns2\T3::cate(),'<br>';
  7. namespace ns2;
  8. class T2
  9. {
  10. public static function index()
  11. {
  12. return '首页';
  13. }
  14. }
  15. class T3
  16. {
  17. public static function cate()
  18. {
  19. return '频道页111';
  20. }
  21. }
  22. namespace ns3;
  23. // 空间的别名
  24. use ns2 as s;
  25. echo s\T2::index(),'<br>';
  26. echo s\T3::cate(),'<br>';
  27. // use ns2\T2;
  28. use ns2\T2 as T;
  29. use ns2\T3;
  30. echo T2::index(),'<br>';
  31. echo T::index(),'<br>';
  32. echo T3::cate(),'<br>';
  33. class T2
  34. {
  35. public static function index()
  36. {
  37. return '首页NS_T2';
  38. }
  39. }

输出:

  1. 首页
  2. 频道页111
  3. 首页
  4. 频道页111
  5. 首页NS_T2
  6. 首页
  7. 频道页111

应用场景:
主要为了代码的复用,如果在一个文件下面有几个类,需要重复写几次文件名,这个时候只要用别名代替,就可以节省代码
空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。

类文件的自动加载器

原理:
自动加载,主要使用 spl_autoload_register() 函数来实现,spl_autoload_register函数的功能就是把传入的函数(参数可以为回调函数或函数名称形式)注册到 SPL autoload 函数队列中,并移除系统默认的 autoload() 函数。一旦调用 spl_autoload_register() 函数,当调用未定义类时,系统就会按顺序调用注册到 spl_autoload_register() 函数的所有函数,而不是自动调用 __autoload() 函数。

示例:

自动加载文件

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

实现php文件:

  1. require 'autoload.php';
  2. use inc\lib\Demo1;
  3. use inc\lib\Demo2;
  4. use inc\lib\Demo3;
  5. echo Demo1::say();
  6. echo Demo2::class.'<br>';
  7. echo Demo3::class;

输出

  1. Hello PHP中文网inc\lib\Demo2
  2. inc\lib\Demo3

总结

通过类自动加载器,可以实现我们的类文件加载,这样就可以加载不同文件下的方法,但是前提是命名空间要与文件名一致,这样才可以加载到类文件中,即使它们名称一样,我们同样可以调用,只需要USE引用,再用静态方法调用,依然可以使用。

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