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 ?>