您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
2-1 类的延迟加载(spl_autoload_register)
发布时间:2023-05-10 17:12:49编辑:雪饮阅读()
-
何谓之延迟加载?
首先我们来看一个例子
就是说假如我从get请求里面拿到Class1,那么我就让Class1里面的say方法执行下,如:
http://www.xyyii.com/index.php?class_name=Class1
同样的,如果拿到的是Class2,也执行下Class2的say方法。
那么要实现这样的需求,一般的如:
class\Class1.php:
<?php
class Class1{
public function say(){
echo "i am ".__CLASS__;
}
}
class\Class2.php
<?php class Class2{ public function say(){ echo "i am ".__CLASS__; } }然后index.php
<?php require('class\Class1.php'); require('class\Class2.php'); $class_name=$_GET['class_name']; if($class_name=="Class1"){ echo (new Class1)->say(); } if($class_name=="Class2"){ echo (new Class2)->say(); } ?>可以看到这样就实现了这个需求,但是有一点不太好,就是说要同时require这两个可能用到的Class1和Class2的类。
那么这里就是需要按需加载了。所以index.php修改如:
<?php $class_name=$_GET['class_name']; if($class_name=="Class1"){ require('class\Class1.php'); echo (new Class1)->say(); } if($class_name=="Class2"){ require('class\Class2.php'); echo (new Class2)->say(); } ?>说是这样的话,在效率上能提速0.001毫秒吧。
这就是所谓的类的延迟加载的基础原理。
优化通过if判断进行require的繁琐
但是这样的写法还是比较繁琐,可以使用spl_autoload_register函数接收一个方法名做为参数,该函数会在需要new某个类的时候,该类不存在时候去执行所接收的这个方法名的对应方法。
那么我们利用此特性将需要require的类都写到这个方法中。
所以index.php再次修改如:
<?php function my_loader($class){ /* * 我发现这里的$class的形参是可以有,也可以不要 * 比如直接写成function my_loader(){xxx}这样也可以 * */ require('class\Class1.php'); require('class\Class2.php'); } spl_autoload_register('my_loader'); $class_name=$_GET['class_name']; if($class_name=="Class1"){ echo (new Class1)->say(); } if($class_name=="Class2"){ echo (new Class2)->say(); } ?>再次优化spl_autoload_register实现方式
虽然上面利用spl_autoload_register优化了if判断进行require的繁琐
但是可以看到又回到了原来的问题上,这里同时require多个类,已经不是按需加载了。
实际上,spl_autoload_register会给所调用的方法在其方法形参上传递一个当前所遇到的不存在的类的类名。那么所以我们这里就可以根据这个形参进一步优化下spl_autoload_register的实现。
<?php function my_loader($class){ //由于反斜杠本来就是转义的意思,所以这里要再加一个转义,使其原型化 require('class\\'.$class.'.php'); } spl_autoload_register('my_loader'); $class_name=$_GET['class_name']; if($class_name=="Class1"){ echo (new Class1)->say(); } if($class_name=="Class2"){ echo (new Class2)->say(); } ?>这样就能保证既能以spl_autoload_register的方式实现按需加载类了。
所谓的类的延迟加载,我认为其实叫按需加载更合适吧。
yii(2)中的实现
据说yii中这个所谓的类的延迟加载的实现核心是位于如
D:\phpstudy_pro\WWW\www.xyyii.com\basic\vendor\yiisoft\yii2\Yii.php
然后在如
D:\phpstudy_pro\WWW\www.xyyii.com\basic\web\index.php
这个入口文件中去调用了上面的实现核心。
这个我觉得可以大概看下,有兴趣的也可以深究下。
关键字词:类,延迟,加载,spl_autoload_register