29)PHP,自动加载类
(1)作用:
类的自动加载是指,在外面的页面中,并不需要去“引入”(包含)类文件,但是程序会在需要一个类的时候就自动去“动态加载”该类。
(2)什么叫做“需要一个类”?通常是这样的情况:
1,创建一个对象的时候(new)
2,直接使用一个类名(操作静态或静态方法)
做法非常简单:
做法1:使用__autoload魔术函数。
即,“当程序需要一个类”的时候,就会去调用该函数:该函数我们需要自己去定义并在其中写好加载类文件的通用语句:
做法2:使用spl_autoload_register函数
该函数的作用是:用它“注册”(声明)多个可以用来代替__autoload函数作用的函数,语法如下:
spl_autoload_regist(“函数名1”);
spl_autoload_regist(“函数名2”);
.........
自然,其后也得去定义这些函数,并且这些函数的作用跟__autoload一样,不过此时就可以应对“更多的情形”——比如类文件分布在不同的目录中。
这个自动加载的代码是这样的,我下面做了一个小的例子来理解这个自动加载类:
一共有三个php文件,他们的目录结构是这样的:
那个a.php是主要的,c.php和b.php是一个辅助文件,就是a.php自动加载c.php和b.php
1 下面的这个是一个主的php文件,a.php
<?php 2 function auto1($classname1){ 3 $file='../'.$classname1.'.php'; 4 if(file_exists($file)) { 5 require $file; 6 } 7 } 8 9 function auto2($classname1){ 10 $file='./'.$classname1.'.php'; 11 if(file_exists($file)) { 12 require $file; 13 } 14 } 15 spl_autoload_register('auto1'); 16 spl_autoload_register('auto2'); 17 $c=new B(); 18 $c->fun(); 19 ?>
下面是b.php
1 <?php 2 /** 3 * Created by PhpStorm. 4 * User: Interact 5 * Date: 2017/4/13 6 * Time: 21:21 7 */ 8 9 print "b"; 10 class B{ 11 function fun(){ 12 echo "我就是外面的那个b.php文件"; 13 14 } 15 }
下面这个是c.php
1 <?php 2 /** 3 * Created by PhpStorm. 4 * User: Interact 5 * Date: 2017/4/13 6 * Time: 21:31 7 */ 8 class C{ 9 function fun1(){ 10 echo "我就是里面的那个C.php文件,"; 11 } 12 }
然后我在那个a.php文件假如去掉对于b.php文件的加载,那么就会报错,但是,我写了那两个自动加载的类,以后就不用每次都include或者require了,直接就是想调谁就调谁。