PHP类的自动加载

__autoload用法


__autoload()是实现了一个自动加载的功能;

当你去实例化一个未声明的类时,会自动调用__autoload()方法;

如果new时,该类已经声明,__autoload()方法不执行;

__autoload()方法被系统自动调用时,收到一个一个参数,值为类名!
HumanModel.php

  1. <?php
  2. // HumanModel类
  3. class HumanModel {
  4.     public function t() {
  5.         echo '人类';
  6.     }
  7. }

01.php

  1. <?php
  2. require('./HumanModel.php');
  3. $lisi = new HumanModel();
  4. $lisi->t();
  5. //人类
  6. /*
  7. 如上,没有require引入进来时,报错
  8. 手动require进来
  9. 如果网站比较大,model类比较多,如何自动加载进来?
  10. HumanModel
  11. UserModel
  12. GoodsModel
  13. CatModel
  14. OrderModel
  15. ...
  16. 1:这么多的model,我用谁,就得include/require谁.
  17. 2:而且不知道,之前是否已经include/require进来某个类
  18. (这个用once可以解决,但once的效率很低)
  19. 这时 我们可以用自动加载!
  20. */
  21. echo '<br />';
  22. function __autoload($c) {
  23.     echo '~~~~',$c,'~~~~~';
  24. }
  25. $ming = new Pig();
  26. //~~~~Pig~~~~~
  27. //( ! ) Fatal error: Class 'Pig' not found in D:\wamp\www\1115\05.php on line 45
  28. /*
  29. 如果调用某个不存在的类,
  30. 在报错之前,
  31. 我们还有一次介入机会 __autoload函数
  32. 系统会调用__autoload()函数,
  33. 并把"类名"自动传给__autoload函数
  34. 我们自然可以在__autoload里 加载需要的类!
  35. 见下页
  36. */

02.php

  1. <?php
  2. /***
  3. __autoload用法
  4. __autoload()是实现了一个自动加载的功能;
  5. 当你去实例化一个为声明的类时,会自动调用__autoload()方法;
  6. 如果new时,该类已经声明,__autoload()方法不执行;
  7. __autoload()方法被系统自动调用时,收到一个一个参数,值为类名!
  8. ***/
  9. function __autoload($c) {
  10.     echo '我先自动加载';
  11.     echo './' . $c . '.php';
  12.     echo '<br />';
  13.     require('./' . $c . '.php');
  14. }
  15. $lisi = new HumanModel();
  16. $lisi->t();
  17. /*我先自动加载./HumanModel.php
  18. 人类*/
  1. <?php
  2. /***
  3. ====笔记部分====
  4. ***/
  5. function test() {
  6.     // 函数内可以写任何合法的PHP代码,包含再声明一个函数/类
  7.     echo '来';
  8.     class Bird {
  9.         public static function sing() {
  10.             echo '百灵鸟儿放声唱!';
  11.         }
  12.     }
  13.     echo '去';
  14. }
  15. // Bird::sing();   // Class 'Bird' not found
  16. test();
  17. //函数要调用才能执行! 
  18. Bird::sing();
  19. //来去百灵鸟儿放声唱!
  1. <?php
  2. /***
  3. ====自定义函数注册成为"自动加载函数"====
  4. -------->自动加载只能用__autoload函数吗?<--------
  5.             答:不是的,其实也可以指定一个函数
  6. 比如:我们就用zidongjiazai()函数
  7. 注意:
  8. 要通知系统,让系统知道--我自己写了一个自动加载方法,用这个!
  9. 怎么通知: 用系统函数 spl_auto_register
  10. ***/
  11. // 下面这句话,是把zidongjiazai函数注册成为"自动加载函数";
  12. spl_autoload_register('zidongjiazai');
  13. function zidongjiazai($c) {
  14.     echo '我引入了./' .  $c . '.php','<br />';
  15.     require('./' .  $c . '.php');
  16. }
  17. $HumanModel = new HumanModel();
  18. $HumanModel->t();
  19. /**
  20. __autoload 是一个函数
  21. 我能自己注册一个自动加载函数
  22. 能否注册类的一个静态方法 当 自动加载函数?
  23. TP里这么做的,自己解决 :)
  24. **/
weinxin
我的微信
把最实用的经验,分享给最需要的读者,希望每一位来访的朋友都能有所收获!
avatar

Comment

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: