PHP类延迟加载机制原理(php懒加载技术)总结
一:归纳总结:
PHP中加载一个类,必须使用require 或者 include把类文件包含进来,才可以实例化类,我们比较传统的方法在使用的时候就是一次性的把所需要的类文件全部进行require,PHP5之前是这么干的,PHP5之后引入了一个函数spl_autoload_register,欲注册的自动装载函数。如果没有提供任何参数,则自动注册autoload的默认实现函数,很多框架中也引入了这个类延迟加载机制,有效了节省了我们在使用类的时候的时间,下面我们就举例说明一下,自动装载类机制。
二:案例分析:
案例1:
<?php /** 类延迟加载原理测试 */ //1.不使用类延迟加载 require 'class/Class1.php'; require 'class/Class2.php'; $c1 = new Class1; $c2 = new Class2; $c1->say(); $c2->say(); //2.使用类延迟加载 function autoload($class){ require ('class/'.$class.'.php'); } spl_autoload_register("autoload"); $c1 = new Class1; $c2 = new Class2; $c1->say(); $c2->say(); ?>
YII2框架就使用了这个机制我们查看YII2框架的代码:
找到vendor\yiisoft\yii2下面的Yii.PHP文件
我们可以看到YII2框架就是使用了类延迟加载机制,在入口文件index.php中包含了Yii.php就会执行自动装载类的方法了,以上就是对PHP类自动装载以及延迟加载的说明,
案例二:
关于 Standard PHP Library (SPL) 的 autoload 的方法,这些都是 PHP 5.1.2 之后才加上的方法。为了方便,这里做了一些设定。假设你有类文件,放在/home/user/class/foo.class.php, 你当前的文件为/home/user/webroot/test.php, 示例代码如下。
在文件test.php中:
<?php class autoload { public static function load( $class name ) { $filename = "/home/user/class/".$classname."class.php"; if (file_exists($filename )) { require_once $filename ; } } } function __autoload( $class name ) { // 这个是默认的 autoload 方法 $filename = "/home/user/class/".$classname."class.php"; if (file_exists($filename )) { require_once $filename ; } } // 注册一个 autoloader spl_autoload_register( 'autoload::load' ); /** * __autoload 方法在 spl_autoload_register 后会失效,因为 autoload_func 函数指针已指向 spl_autoload 方法 * 可以通过下面的方法来把 _autoload 方法加入 autoload_functions list */ spl_autoload_register( '__autoload' ); // 注:下面的类看上去没有定义,但其实系统根据sql_autoload_register提供的路径会自动去/home/user// /class/*.class.php下搜索foo.class.php文件,如果没找到才报错。 $foo = new foo(); $foo ->bar(); ?>
这些都是php懒加载技术。也可以说是延迟加载!其实我们当今的框架中都有懒加载技术