PHP中spl_autoload_register()函数用法实例详解


Posted in PHP onJuly 18, 2016

本文实例分析了PHP中spl_autoload_register()函数用法。分享给大家供大家参考,具体如下:

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

一、__autoload

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

printit.class.php:

<?php
class PRINTIT {
 function doPrint() {
 echo 'hello world';
 }
}
?>

index.php

<?
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有与曲同工之妙,看个简单的例子:

<?
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() 调用静态方法

<?
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指向这两个不同的函数地址来实现不同的自动加载机制。

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函数,那么,会根据注册的先后,如果在第一个注册的方法或函数里加载了类文件,就不会再执行第二个被注册的类的方法或函数。反之就会执行第二个被注册的类的方法或函数。

<?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 ();
?>

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP脚本的10个技巧(2)
Oct 09 PHP
php中通过正则表达式下载内容中的远程图片的函数代码
Jan 10 PHP
php重定向的三种方法分享
Feb 22 PHP
不使用php api函数实现数组的交换排序示例
Apr 13 PHP
ThinkPHP3.1查询语言详解
Jun 19 PHP
CodeIgniter模板引擎使用实例
Jul 15 PHP
CodeIgniter辅助之第三方类库third_party用法分析
Jan 20 PHP
基于PHP实现数据分页显示功能
May 26 PHP
zend框架实现支持sql server的操作方法
Dec 08 PHP
PHP精确到毫秒秒杀倒计时实例详解
Mar 14 PHP
php快速导入大量数据的实例方法
Sep 23 PHP
PHP读取文件或采集时解决中文乱码
Mar 09 PHP
详谈PHP程序Laravel 5框架的优化技巧
Jul 18 #PHP
3种方法轻松处理php开发中emoji表情的问题
Jul 18 #PHP
PHP生成图像验证码的方法小结(2种方法)
Jul 18 #PHP
Yii2中DropDownList简单用法示例
Jul 18 #PHP
Yii2使用dropdownlist实现地区三级联动功能的方法
Jul 18 #PHP
Yii2框架dropDownList下拉菜单用法实例分析
Jul 18 #PHP
用HTML/JS/PHP方式实现页面延时跳转的简单实例
Jul 18 #PHP
You might like
php实现ping
2006/10/09 PHP
php的一些小问题
2010/07/03 PHP
php数组函数序列之array_slice() - 在数组中根据条件取出一段值,并返回
2011/11/07 PHP
php使用Smarty的相关注意事项及访问变量的几种方式
2011/12/08 PHP
PHP原生函数一定好吗?
2014/12/08 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
2017/02/04 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
JQuery 写的个性导航菜单
2009/12/24 Javascript
BOOTSTRAP时间控件显示在模态框下面的bug修复
2015/02/05 Javascript
JavaScript把数组作为堆栈使用的方法
2015/03/20 Javascript
js实现表单多按钮提交action的处理方法
2015/10/24 Javascript
jquery实现手风琴效果
2015/11/20 Javascript
javascript表单处理具体实现代码(表单、链接、按钮)
2016/05/07 Javascript
JS模仿腾讯图片站的图片翻页按钮效果完整实例
2016/06/21 Javascript
初探nodeJS
2017/01/24 NodeJs
浅谈原生JS实现jQuery的animate()动画示例
2017/03/08 Javascript
详谈commonjs模块与es6模块的区别
2017/10/18 Javascript
vue2.0s中eventBus实现兄弟组件通信的示例代码
2017/10/25 Javascript
深入学习js函数的隐式参数 arguments 和 this
2019/06/24 Javascript
微信小程序HTTP请求从0到1封装
2019/09/09 Javascript
vue+elementUI动态生成面包屑导航教程
2019/11/04 Javascript
如何使用JavaScript检测空闲的浏览器选项卡
2020/05/28 Javascript
[05:15]2018年度CS GO社区贡献奖-完美盛典
2018/12/16 DOTA
[03:00]DOTA2-DPC中国联赛1月18日Recap集锦
2021/03/11 DOTA
DJANGO-ALLAUTH社交用户系统的安装配置
2014/11/18 Python
详解python 破解网站反爬虫的两种简单方法
2020/02/09 Python
在python里使用await关键字来等另外一个协程的实例
2020/05/04 Python
Django设置Postgresql的操作
2020/05/14 Python
Python实现疫情通定时自动填写功能(附代码)
2020/05/27 Python
Numpy中np.max的用法及np.maximum区别
2020/11/27 Python
html5拍照功能实现代码(htm5上传文件)
2013/12/11 HTML / CSS
求职信模版
2013/11/30 职场文书
母校寄语大全
2014/04/10 职场文书
2014年文明创建工作总结
2014/11/25 职场文书
2014年社团工作总结范文
2014/11/27 职场文书
JS中forEach()、map()、every()、some()和filter()的用法
2022/05/11 Javascript