php的lazyload

前言

其实在我眼里lazyload一直是前端用来延迟加载图片的,直到昨天有人提到php中lazyload 的概念,我听的一脸懵逼,完全不知道是什么意思。
今晚有空查了一下资料,原来真的有lazyload这个概念,其实就是php上的autoload。只不过有人 把它称为lazyload,而实际上这个名字还算贴切吧。

关于autoload

其实这个东西是非常常见,也非常方便。大多数框架中都存在这个东西,那就是spl_autoload_register

class LoadClass {
public static function __autoload($class) {
require $class.'class.php';
}
}
spl_autoload_register('LoadClass::__autoload');

当然,也可以直接用匿名函数

spl_autoload_register(function ($class) {
include $class . '.class.php';
});

这样便可实现指定类的自动加载。 当然,命名规则是不一样的,这种情况下只能实现类名和文件名的映射关系为ClassName=>ClassName.Class.php。 在此基础之上,适配更多的规则再加上缓存就可以实现类似composerautoload

延伸

spl_autoload_register的原型为

bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )

将函数注册到SPL autoload函数队列中。如果该队列中的函数尚未激活,则激活它们。 如果在你的程序中已经实现了`autoload()函数,它必须显式注册到autoload()队列中。 因为spl_autoload_register()函数会将Zend Engine中的autoload()函数取代为spl_autoload()spl_autoload_call()`。 如果需要多条 autoload 函数,spl_autoload_register() 满足了此类需求。 它实际上创建了 autoload 函数的队列,按定义时的顺序逐个执行。相比之下, __autoload() 只可以定义一次。

autoload_function

欲注册的自动装载函数。如果没有提供任何参数,则自动注册 autoload 的默认实现函数spl_autoload()。

throw

此参数设置了 autoload_function 无法成功注册时, spl_autoload_register()是否抛出异常。

prepend

如果是 true,spl_autoload_register() 会添加函数到队列之首,而不是队列尾部。

再度延伸

根据上面参数的说明,如果spl_autoload_register没有任何参数,将会自动注册spl_autoload为加载函数。 其实我们可以利用这一条:

//1. 设置加载路径
set_include_path("path/to/include/class");
//2. 设置文件后缀
spl_autoload_extensions('.class.php');
//3. 直接使用默认的自动加载函数
spl_autoload_register();

此时,当你在使用use A\B\C;时,将会自动loadpath/to/include/class/A/B/C.class.php

再再扩展

注意到这个函数上面说的,可以注册一个队列,而不仅仅是一个自动加载的loader,因此我们在实际的mvc操作中, 可以根据需要,或者根据逻辑注册多个loader

<?php
class Loader
{
/**
* Controller Directory Path
*
* @var Array
* @access protected
*/
protected $_controllerDirectoryPath = array();
/**
* Model Directory Path
*
* @var Array
* @access protected
*/
protected $_modelDirectoryPath = array();
/**
* Library Directory Path
*
* @var Array
* @access protected
*/
protected $_libraryDirectoryPath = array();
/**
* Constructor
* Constant contain my full path to Model, View, Controllers and Lobrary-
* Direcories.
*
* @Constant MPATH,VPATH,CPATH,LPATH
*/
public function __construct()
{
$this->modelDirectoryPath = MPATH;
$this->viewDirectoryPath = VPATH;
$this->controllerDirectoryPath = CPATH;
$this->libraryDirectoryPath = LPATH;
spl_autoload_register(array($this,'load_controller'));
spl_autoload_register(array($this,'load_model'));
spl_autoload_register(array($this,'load_library'));
log_message('debug',"Loader Class Initialized");
}
/**
*-----------------------------------------------------
* Load Library
*-----------------------------------------------------
* Method for load library.
* This method return class object.
*
* @library String
* @param String
* @access public
*/
public function load_library($library, $param = null)
{
if (is_string($library)) {
return $this->initialize_class($library);
}
if (is_array($library)) {
foreach ($library as $key) {
return $this->initialize_class($library);
}
}
}
/**
*-----------------------------------------------------
* Initialize Class
*-----------------------------------------------------
* Method for initialise class
* This method return new object.
* This method can initialize more class using (array)
*
* @library String|Array
* @param String
* @access public
*/
public function initialize_class($library)
{
try {
if (is_array($library)) {
foreach($library as $class) {
$arrayObject = new $class;
}
return $this;
}
if (is_string($library)) {
$stringObject = new $library;
}else {
throw new ISException('Class name must be string.');
}
if (null == $library) {
throw new ISException('You must enter the name of the class.');
}
} catch(Exception $exception) {
echo $exception;
}
}
/**
* Autoload Controller class
*
* @param string $class
* @return object
*/
public function load_controller($controller)
{
if ($controller) {
set_include_path($this->controllerDirectoryPath);
spl_autoload_extensions('.php');
spl_autoload($class);
}
}
/**
* Autoload Model class
*
* @param string $class
* @return object
*/
public function load_models($model)
{
if ($model) {
set_include_path($this->modelDirectoryPath);
spl_autoload_extensions('.php');
spl_autoload($class);
}
}
/**
* Autoload Library class
*
* @param string $class
* @return object
*/
public function load_library($library)
{
if ($library) {
set_include_path($this->libraryDirectoryPath);
spl_autoload_extensions('.php');
spl_autoload($class);
}
}
}
?>

总结

看来我们这种自学的和科班出身的差别非常之大,像lazyload这种听的我是一脸懵逼,完全不知道他在说什么, 估计这个时候别人可能心里在想,是有多菜,连autoload都不知道。。

版权说明

本页地址为 https://post.zz173.com/detail/5747.html,本文作者为落月
本文采用 署名-相同方式共享 3.0 中国大陆许可协议 ,分享、演绎需署名且使用相同方式共享。转载请务必保留本页网址和作者信息,否则即为侵权。

– EOF –