关于PHP中spl

在了解这个函数之前先来看另一个函数:__autoload。

一、__autoload

这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数。看下面例子:

printit.class.php:

1

2

3

4

5

6

7

<?php

class PRINTIT {

 function doPrint() {

 echo 'hello world';

 }

}

?>

index.php

1

2

3

4

5

6

7

8

9

<?

function __autoload( $class ) {

 $file = $class . '.class.php';

 if ( is_file($file) ) {

 require_once($file);

 }

}

$obj = new PRINTIT();

$obj->doPrint();?>

运行index.php后正常输出hello world。在index.php中,由于没有包含printit.class.php,在实例化printit时,自动调用__autoload函数,参数$class的值即为类名printit,此时printit.class.php就被引进来了。

在面向对象中这种方法经常使用,可以避免书写过多的引用文件,同时也使整个系统更加灵活。

二、spl_autoload_register()

再看spl_autoload_register(),这个函数与__autoload有与曲同工之妙,看个简单的例子:

1

2

3

4

5

6

7

8

9

10

<?

function loadprint( $class ) {

 $file = $class . '.class.php';

 if (is_file($file)) {

 require_once($file);

 }

}

spl_autoload_register( 'loadprint' );

$obj = new PRINTIT();

$obj->doPrint();?>

将__autoload换成loadprint函数。但是loadprint不会像__autoload自动触发,这时spl_autoload_register()就起作用了,它告诉PHP碰到没有定义的类就执行loadprint()。

spl_autoload_register() 调用静态方法

1

2

3

4

5

6

7

8

9

10

11

12

13

<?

class test {

 public static function loadprint( $class ) {

 $file = $class . '.class.php';

 if (is_file($file)) {

  require_once($file);

 }

 }

}

spl_autoload_register( array('test','loadprint') );

//另一种写法:spl_autoload_register( "test::loadprint" );

$obj = new PRINTIT();

$obj->doPrint();?>

spl_autoload_register

(PHP 5 >= 5.1.2)

spl_autoload_register — 注册__autoload()函数

说明

bool spl_autoload_register ([ callback $autoload_function ] )
将函数注册到SPL __autoload函数栈中。如果该栈中的函数尚未激活,则激活它们。

如果在你的程序中已经实现了__autoload函数,它必须显式注册到__autoload栈中。因为spl_autoload_register()函数会将Zend Engine中的__autoload函数取代为spl_autoload() 或 spl_autoload_call()。

参数

autoload_function

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

返回值

如果成功则返回 TRUE,失败则返回 FALSE。

注:

SPL是Standard PHP Library(标准PHP库)的缩写。它是PHP5引入的一个扩展库,其主要功能包括autoload机制的实现及包括各种Iterator接口或类。SPL autoload机制的实现是通过将函数指针autoload_func指向自己实现的具有自动装载功能的函数来实现的。

SPL有两个不同的函数spl_autoload, spl_autoload_call,通过将autoload_func指向这两个不同的函数地址来实现不同的自动加载机制。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

classLOAD

{

 staticfunctionloadClass($class_name)

  {

    $filename= $class_name.".class.php";

 $path= "include/".$filename

    if(is_file($path)) returninclude$path;

  }

}

/**

 * 设置对象的自动载入

 * spl_autoload_register — Register given function as __autoload() implementation

 */

spl_autoload_register(array('LOAD', 'loadClass'));

/**

*__autoload 方法在 spl_autoload_register 后会失效,因为 autoload_func 函数指针已指向 spl_autoload 方法

* 可以通过下面的方法来把 _autoload 方法加入 autoload_functions list

*/

spl_autoload_register( '__autoload');

如果同时用spl_autoload_register注册了一个类的方法和__autoload函数,那么,会根据注册的先后,如果在第一个注册的方法或函数里加载了类文件,就不会再执行第二个被注册的类的方法或函数。反之就会执行第二个被注册的类的方法或函数。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

<?php

class autoloader {

  public static $loader;

  public static function init() {

    if (self::$loader == NULL)

      self::$loader = new self ();

    return self::$loader;

  }

  public function __construct() {

    spl_autoload_register ( array ($this, 'model' ) );

    spl_autoload_register ( array ($this, 'helper' ) );

    spl_autoload_register ( array ($this, 'controller' ) );

    spl_autoload_register ( array ($this, 'library' ) );

  }

  public function library($class) {

    set_include_path ( get_include_path () . PATH_SEPARATOR . '/lib/' );

    spl_autoload_extensions ( '.library.php' );

    spl_autoload ( $class );

  }

  public function controller($class) {

    $class = preg_replace ( '/_controller$/ui', '', $class );

    set_include_path ( get_include_path () . PATH_SEPARATOR . '/controller/' );

    spl_autoload_extensions ( '.controller.php' );

    spl_autoload ( $class );

  }

  public function model($class) {

    $class = preg_replace ( '/_model$/ui', '', $class );

    set_include_path ( get_include_path () . PATH_SEPARATOR . '/model/' );

    spl_autoload_extensions ( '.model.php' );

    spl_autoload ( $class );

  }

  public function helper($class) {

    $class = preg_replace ( '/_helper$/ui', '', $class );

    set_include_path ( get_include_path () . PATH_SEPARATOR . '/helper/' );

    spl_autoload_extensions ( '.helper.php' );

    spl_autoload ( $class );

  }

}

//call

autoloader::init ();

?>

总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。

(0)

相关推荐

  • 从一道CTF练习题浅谈php原生文件操作类

    前言 记一次CTF练习有感,觉得需要记录一波-还有就是最近CTF比赛中利用php原生类来进行反序列化的题目比较多,所以就紧跟时代潮流- 一.SPL 顾名思义,SPL就是Standard PHP Lib ...

  • PHP的SPL扩展库(五)文件及设计模式

    PHP的SPL扩展库(五)文件及设计模式 对于 SPL 来说,除了我们之前学习到的各种 数据结构 以及 迭代器 之外,还有一类非常好用的功能就是对于文件的操作.今天我们就来学习这方面的内容,同时,这也 ...

  • 深入学习Composer原理(二)

    本系列的第二篇文章,这次我们聊聊:spl_autoload_register()函数 PHP的SPL库作为扩展库,已经于5.3.0版本后默认保持开启,成为PHP的一组强大的核心扩展库.大家有时间可以多 ...

  • PHP中类的自动加载

    PHP中类的自动加载 在之前,我们已经学习过Composer自动加载的原理,其实就是利用了PHP中的类自动加载的特性.在文末有该系列文章的链接. PHP中类的自动加载主要依靠的是__autoload( ...

  • PHP的SPL扩展库(四)函数

    PHP的SPL扩展库(四)函数 今天我们继续来学习 SPL 中的内容,这篇文章的内容是比较简单的关于 SPL 中所提供的一系列函数相关的内容.其实在之前的不少文章中我们都已经接触过一些 SPL 中提供 ...

  • 深入学习Composer原理(三)

    本系列第三篇文章,一起了解下PSR规范中的PSR4和PSR0规范 首先恭喜大家,包括我自己,坚持到了现在.这篇文章之后,Composer的基础原理就清晰明了咯.也就是说,Composer所利用的正是s ...

  • PHP自动加载学习记录

    PHP自动加载学习记录

  • 在PHP中使用SPL库中的对象方法进行XML与数组的转换

    在PHP中使用SPL库中的对象方法进行XML与数组的转换 虽说现在很多的服务提供商都会提供 JSON 接口供我们使用,但是,还是有不少的服务依然必须使用 XML 作为接口格式,这就需要我们来对 XML ...

  • [PHP小课堂]在PHP中使用SPL库进行XML与数组的转换

    [PHP小课堂]在PHP中使用SPL库中的对象方法进行XML与数组的转换 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[xiaoyuezigonggong/149844827]免费得 ...

  • SPL 中调用 Python 程序

    集算器是强大的数据计算引擎,但目前对于机器学习算法的提供还不够丰富.而 python 中有许多此类算法.借助 YM 外部库,就可以让集算器 SPL 调用 python 写的代码,从而弥补这一不足.下面 ...

  • 在微信中与好友聊天时如何拍摄照片发送给对方

    卡饭网梦在深巷2019-04-20 17:05:36 随着科技的发展,微信已经成为人们日常生活中必不可少的工具,当我们在使用微信与好友聊天时,是否可以直接拍摄图片给好友看呢?接下来就由小编来告诉大家. ...

  • 常见的10种病最怕的中成用药,中医医师医...

    常见的10种病最怕的中成用药,中医医师医师都在用,建议收藏备用! 1.子宫肌瘤--"最怕"--宫瘤消颗粒 2.口疮--"最怕"--知柏地黄丸 3.颈椎病--&q ...

  • 如何在微信中现拍照片给好友?

    卡饭网梦在深巷2019-01-16 13:40:18 相信很多小伙伴都有在使用微信,在其中如何才能现拍照片给好友呢?方法很简单,下面小编就来为大家介绍. 具体如下: 1. 首先,打开手机上的微信.进入 ...

  • 中医医生总结:6种常见病.对症使用的中成...

    中医医生总结:6种常见病.对症使用的中成药,便宜好用,建议保存备用   ▄气滞血瘀,湿热蕴结所致的盆腔炎--对症使用--坤复康胶囊  组成成分:女贞子.南刘寄奴.赤芍.苦参.香附.猪苓.乌药.粉萆解. ...

  • 家中常备7种儿童常用的中成.药,几块钱轻...

    家中常备7种儿童常用的中成.药,几块钱轻松解决孩子厌食.消化不良大便干结.感冒   1.小儿豉翘清热颗粒   比较多用于小儿风热感冒滞证,症见发热咳嗽,鼻塞流涕,咽红肿痛,纳呆口渴,脘腹胀满,便秘或者 ...

  • 京剧《狮吼记》好夫妻理当在家中厮守,帐幔里度春光君子好逑!

    京剧《狮吼记》好夫妻理当在家中厮守,帐幔里度春光君子好逑!