php之类的自动加载

 1 <?php
 2 /*
 3 类的自动加载
 4 */
 5 /*
 6 require('./HumanModel.php');
 7 $lisi = new HumanModel();
 8 $lisi->t();
 9 echo '<br />';
10 */
11 /*
12 如上,没有require时会报错
13 手动require进来
14 
15 如果网站比较大,model类比较多
16 HumanModel
17 UserModel
18 GoodsModel
19 CatModel
20 OrderModel
21 ...
22 ...
23 这么多的model,我用谁,就得include/require谁
24 而且不知道,之前是否已经include/require进来某个类
25 (这个用once可以解决,但once的效率比较很低)
26 
27 这时我们可以用自动加载
28 
29 
30 */
31 /*
32 function __autoload($c) {
33     require('./' . $c . '.php');
34 }
35 $ming = new HumanModel();
36 $ming->t();
37 /*
38 如果调用某个不存在的类
39 在报错之前
40 我们还有一次介入机会,用__autoload函数
41 
42 系统会调用__autoload()函数
43 并把类名自动传给__autoload函数
44 
45 我们就可以在__autoload里面加载需要的类
46 */
47 
48 function test() {
49     //函数内可以写任何合法的php代码,包括再声明函数/类
50     //类声明是全局有效的,不管在多深的函数内声明
51     class Bird {
52         public static function sing() {
53             echo '唱歌';
54         }
55     }
56 
57 }
58 test();//这里调用一下test,下面的一句就可以执行了
59 Bird::sing();//如果test函数都没调用,里面声明的类就调用了,这当然不行Fatal error: Class 'Bird' not found
60 
61 /*
62 自动加载只能用__autoload函数吗?
63 答:不是的,其实也可以自定义一个函数
64 
65 比如就用zidongjiazai()函数
66 
67 注意:要通知系统,让系统知道--我自己写了一个自动加载的方法,要用我自己的
68 怎么通知:用系统函数 spl_autoload_register
69 */
70 //下面这句话,是把zidongjiazai函数注册为'自动加载函数相当于__autoload的功能'
71 spl_autoload_register('zidongjiazai');
72 function zidongjiazai($c) {
73     require('./' . $c . '.php');
74 }
75 $lisi = new HumanModel();
76 $lisi->t();
77 /*
78 __autoload是一个函数
79 
80 我能自己注册一个自动加载的函数
81 能否注册类的一个静态方法作为自动加载函数?
82 
83 答:可以的
84 如下
85 
86 spl_autoload_register('autoload::zidongjiazai');
87 class autoload {
88     public static function zidongjiazai($c) {
89         require('./' . $c . '.php');
90     }
91 }
92 $lisi = new HumanModel();
93 $lisi->t();
94 */
95 ?>

 

posted @ 2015-07-24 14:09  museluo  阅读(232)  评论(0编辑  收藏  举报