Blogger Information
Blog 36
fans 1
comment 0
visits 29737
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
php中命名空间与自动加载
Jason
Original
587 people have browsed it

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引用,再用静态方法调用,依然可以使用。

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:命名空间, 重要性对现代php来说, 不可或缺
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