php之自动加载(懒加载)
有A类和B类,如果在A类实例化B类,最简单直接的方法就是在B中使用include require_once A的文件,但是这种方法显然是不友好的,在框架中叶不是这么做的,在框架中使用的是自动加载的机制也成为懒加载。
php中自动加载使用spl_autoload_register来完成在没有指定类的情况下自动加载的动作,有了这个方法在new一个类之前,就算没有引入这个类的文件,也能正确初始化指定类,这样我们就不用使用include require_once来引入文件,其实这个方法就是对include方法的封装,同时需要自己实现。下面举个🌰,并说明其原理
下面这段是autolod.php的源码:
1 <?php 2 spl_autoload_register(array('autoload','load')); 3 class autoload{ 4 public static function load($classnName){ 5 if ( !class_exists($classnName) ) { 6 $file = $classnName.'.php'; 7 require_once('./'.$file); 8 9 } 10 } 11 } 12 $class = new autoload_test(); 13 $class->test();
下面这段是autolod_test.php的源码:
1 <?php 2 class autoload_test{ 3 function test(){ 4 echo 'this is test'; 5 } 6 }
代码很简单,但是足以说明spl_autoload_register自动加载的机制,在代码执行的过程中,当new一个未包含的类的时候,php会去执行spl_autoload_register中的第一个参数,就是需要new的类名,这个函数的功能就是把没有引入的类引入进来,但是有个前提就是类的名字和文件的名字要一致,这样就实现了自动加载的功能,是不是很简单。
spl_autoload_register这个方法还有另一种常用的调用方式spl_autoload_register(array($className,$functionName));使用指定的类中的静态方法去完成自动加载,静态方法里面的结构就是完成autoload里面的逻辑。