博客列表 >类/函数的自动加载

类/函数的自动加载

longlong
longlong原创
2020年07月31日 12:34:24688浏览

1. 类的自动加载

我的理解:自动加载,就是当我们想引入一个或多个类时,在当前脚本中直接使用,会有一个自动加载器帮助我们自动引入类文件,并且被引入的类要具备两个条件:

  • 类名必须和类文件名一致

  • (存在命名空间时)命名空间的名称要和当前类文件的路径一致

下面写一个目录,创建三个文件:

  • test1.php
  1. <?php
  2. // 1. 当前类的命名空间与当前类的文件路径对应起来
  3. namespace inc\lib;
  4. // 2. 类名必须与当前类文件名称相同
  5. class test1 {
  6. const NAME = '果冻';
  7. public static function show ()
  8. {
  9. return __METHOD__;
  10. }
  11. }
  12. function test1 ()
  13. {
  14. return '111';
  15. }
  • test2.php
  1. <?php
  2. // 1. 当前类的命名空间与当前类的文件路径对应起来
  3. namespace inc\lib;
  4. // 2. 类名必须与当前类文件名称相同
  5. class test2 {
  6. const HOBBY = 'fish';
  7. public static function show ()
  8. {
  9. return self::HOBBY;
  10. }
  11. }
  12. function test2 ()
  13. {
  14. return '222';
  15. }
  • test3.php
  1. <?php
  2. // 1. 当前类的命名空间与当前类的文件路径对应起来
  3. namespace inc\lib;
  4. // 2. 类名必须与当前类文件名称相同
  5. class test3 {
  6. const WORK = '学习';
  7. }
  8. function test3 ()
  9. {
  10. return '333';
  11. }
  • 自动加载部分
  1. <?php
  2. // 存在命名空间时的自动加载
  3. // 类的自动加载
  4. try{
  5. // $class_name 表示类名称 相当于 Demo::class
  6. spl_autoload_register(function($class_name){
  7. $path = str_replace('\\',DIRECTORY_SEPARATOR,$class_name);
  8. $file = __DIR__.DIRECTORY_SEPARATOR.$path.'.php';
  9. if (!(is_file($file) && file_exists($file)))
  10. throw new \Exception('不是文件名文件不存在');
  11. require $file;
  12. });
  13. }catch(Exception $e){
  14. die($e->getMessage());
  15. }
  16. // 别名
  17. use inc\lib\test1;
  18. use inc\lib\test2;
  19. use inc\lib\test3;
  20. // 输出
  21. echo test1::NAME,'<hr>';
  22. echo test2::HOBBY,'<hr>';
  23. echo test3::WORK,'<hr>';

2. 函数的自动加载(一)

引入类文件以后,便可以使用里面的函数,所以在使用函数前需要先new class

  1. <?php
  2. // 存在命名空间时的自动加载
  3. try{
  4. spl_autoload_register(function($class){
  5. $path = str_replace('\\',DIRECTORY_SEPARATOR,$class);
  6. $file = __DIR__.DIRECTORY_SEPARATOR.$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. // 别名
  15. use inc\lib\test1;
  16. use inc\lib\test2;
  17. use inc\lib\test3;
  18. // 引入类文件
  19. new test1;
  20. new test2;
  21. new test3;
  22. // 引入类文件中的函数
  23. echo inc\lib\test1(),'<br>';
  24. echo inc\lib\test2(),'<br>';
  25. echo inc\lib\test3(),'<br>';

3. 函数的自动加载(二)

当不存在命名空间时的类/函数自动加载

使用以下目录操作:

  • t1.php
  1. <?php
  2. class t1{}
  3. function t1()
  4. {
  5. return '111111111'.'<br>';
  6. }
  • t2.php
  1. <?php
  2. class t2{}
  3. function t2()
  4. {
  5. return '2222222222'.'<br>';
  6. }
  • t3.php
  1. <?php
  2. class t3{}
  3. function t3()
  4. {
  5. return '3333333333'.'<br>';
  6. }
  • 自动加载部分
  1. <?php
  2. // 不存在命名空间时自动加载
  3. // 方法一:注册一个自动加载函数
  4. spl_autoload_register('meth');
  5. function meth ($class){
  6. $file = __DIR__.DIRECTORY_SEPARATOR.'some/sn/'.$class.'.php';
  7. require_once $file;
  8. }
  9. // 必须先new一下,引入类文件
  10. new t1;
  11. new t2;
  12. new t3;
  13. // 引入文件以后就可以使用里面的函数或方法了
  14. echo t1();
  15. echo t2();
  16. echo t3();
  17. // 方法二:使用自动加载器,传入回调函数
  18. /*
  19. spl_autoload_register(function($class){
  20. // 当存在命名空间的时候才能加上$path这段代码
  21. // $path = str_replace('\\',DIRECTORY_SEPARATOR,$class);
  22. $file = __DIR__.DIRECTORY_SEPARATOR.'some/sn/'.$class.'.php';
  23. if (!(is_file($file) && file_exists($file)))
  24. throw new \Exception('不是文件名文件不存在');
  25. require $file;
  26. });
  27. // 必须先new一下,引入类文件
  28. new t1;
  29. new t2;
  30. new t3;
  31. // 引入文件以后就可以使用里面的函数或方法了
  32. echo t1();
  33. echo t2();
  34. echo t3();
  35. */

4. 总结

也许没有理解很好把,我现在的理解是,要实现自动加载,首先得实现自动加载这个文件,通过自动加载器来操作的话参数就是类名称,所以不管是要实现类加载还是函数加载,类文件中都要定义一个类(满足上述两个条件的类),当我们在当前脚本中使用类时就会通过自动加载器自动去搜索相应的类文件,然后引入,引入类文件以后,文件中的类或函数即可使用

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