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+DBM的同学录程序(4)
Oct 09 PHP
php数组相加 array(“a”)+array(“b”)结果还是array(“a”)
Sep 19 PHP
保存到桌面、设为桌面且带图标的PHP代码
Nov 19 PHP
IIS6.0 开启Gzip方法及PHP Gzip函数分享
Jun 08 PHP
php中http与https跨域共享session的解决方法
Dec 20 PHP
php魔术函数__call()用法实例分析
Feb 13 PHP
如何使用php脚本给html中引用的js和css路径打上版本号
Nov 18 PHP
php自动载入类用法实例分析
Jun 24 PHP
php版微信发红包接口用法示例
Sep 23 PHP
zend框架实现支持sql server的操作方法
Dec 08 PHP
Ubuntu彻底删除PHP7.0的方法
Jul 27 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
Apr 04 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目录管理函数小结
2008/09/10 PHP
php压缩多个CSS为一个css的代码并缓存
2011/04/21 PHP
php计算几分钟前、几小时前、几天前的几个函数、类分享
2014/04/09 PHP
php获取网页请求状态程序示例
2014/06/17 PHP
php跨站攻击实例分析
2014/10/28 PHP
php的api数据接口书写实例(推荐)
2016/09/22 PHP
jquery 插件实现图片延迟加载效果代码
2010/02/06 Javascript
微信小程序promsie.all和promise顺序执行
2017/10/27 Javascript
webpack组织模块打包Library的原理及实现
2018/03/10 Javascript
百度小程序之间的页面通信过程详解
2019/07/18 Javascript
CountUp.js实现数字滚动增值效果
2019/10/17 Javascript
JS实现打字游戏
2019/12/17 Javascript
python实现将excel文件转化成CSV格式
2018/03/22 Python
python判断所输入的任意一个正整数是否为素数的两种方法
2019/06/27 Python
Django  ORM 练习题及答案
2019/07/19 Python
python多继承(钻石继承)问题和解决方法简单示例
2019/10/21 Python
pycharm中import呈现灰色原因的解决方法
2020/03/04 Python
Anaconda和ipython环境适配的实现
2020/04/22 Python
Python3 用什么IDE开发工具比较好
2020/11/28 Python
html5自定义video标签的海报与播放按钮功能
2019/12/04 HTML / CSS
详解HTML5如何使用可选样式表为网站或应用添加黑暗模式
2020/04/07 HTML / CSS
耐克巴西官方网站:Nike巴西
2016/08/14 全球购物
美国复古街头服饰精品店:Need Supply Co.
2017/02/22 全球购物
N:Philanthropy官网:美国洛杉矶基础款服装
2020/06/09 全球购物
园林毕业生自我鉴定范文
2013/12/29 职场文书
百货商场楼层班组长竞聘书
2014/03/31 职场文书
工作推荐信范文
2014/05/10 职场文书
向国旗敬礼学生寄语大全
2014/09/30 职场文书
2014年基层党支部工作总结
2014/12/04 职场文书
春秋淹城导游词
2015/02/11 职场文书
应聘教师自荐信
2015/03/26 职场文书
追讨欠款律师函
2015/05/27 职场文书
植树节新闻稿
2015/07/17 职场文书
2016年寒假见闻
2015/10/10 职场文书
分析ZooKeeper分布式锁的实现
2021/06/30 Java/Android
SpringDataJPA在Entity中常用的注解介绍
2021/12/06 Java/Android