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 相关文章推荐
ThinkPHP模板Switch标签用法示例
Jun 30 PHP
PHP版本如何选择?应该使用哪个版本?
May 13 PHP
Yii使用migrate命令执行sql语句的方法
Mar 15 PHP
PHP中spl_autoload_register()函数用法实例详解
Jul 18 PHP
PHP支付系统设计与典型案例分享
Aug 02 PHP
yii2利用自带UploadedFile实现上传图片的示例
Feb 16 PHP
php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名
May 26 PHP
如何利用预加载优化Laravel Model查询详解
Aug 11 PHP
Laravel5.5新特性之友好报错以及展示详解
Aug 13 PHP
PHP等比例压缩图片的实例代码
Jul 26 PHP
PHP使用JpGraph绘制折线图操作示例【附源码下载】
Oct 18 PHP
浅谈Laravel模板实体转义带来的坑
Oct 22 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 用sock技术发送邮件的函数
2007/07/21 PHP
PHP实现Socket服务器的代码
2008/04/03 PHP
php $_ENV为空的原因分析
2009/06/01 PHP
Php header()函数语法及使用代码
2013/11/04 PHP
PHP四舍五入精确小数位及取整
2014/01/14 PHP
PHP常见数组函数用法小结
2016/03/21 PHP
使用WAMP搭建PHP本地开发环境
2017/05/10 PHP
laravel框架上传图片实现实时预览功能
2019/10/14 PHP
jQuery Lightbox 图片展示插件使用说明
2010/04/25 Javascript
仅IE6/7/8中innerHTML返回值忽略英文空格的问题
2011/04/07 Javascript
jQuery实现类似标签风格的导航菜单效果代码
2015/08/25 Javascript
js实现div在页面拖动效果
2016/05/04 Javascript
JS给swf传参数的实现方法
2016/09/13 Javascript
Three.js利用dat.GUI如何简化试验流程详解
2017/09/26 Javascript
node结合swig渲染摸板的方法
2018/04/11 Javascript
AngularJS实现与后台服务器进行交互的示例讲解
2018/08/13 Javascript
详解服务端预渲染之Nuxt(介绍篇)
2019/04/07 Javascript
解决layui的使用以及针对select、radio等表单组件不显示的问题
2019/09/05 Javascript
微信小程序可滑动月日历组件使用详解
2019/10/21 Javascript
Angular8 实现table表格表头固定效果
2020/01/03 Javascript
如何使用七牛Python SDK写一个同步脚本及使用教程
2015/08/23 Python
python3 遍历删除特定后缀名文件的方法
2018/04/23 Python
java判断三位数的实例讲解
2019/06/10 Python
Python3实现zip分卷压缩过程解析
2019/10/09 Python
python 两个数据库postgresql对比
2019/10/21 Python
Django如何批量创建Model
2020/09/01 Python
100%有机精油,美容油:House of Pure Essence
2018/10/30 全球购物
英文请假条
2014/04/11 职场文书
工作分析计划书
2014/04/30 职场文书
应急管理培训方案
2014/06/12 职场文书
应届大专生自荐书
2014/06/16 职场文书
关于践行三严三实的心得体会
2016/01/05 职场文书
学生检讨书范文
2019/06/24 职场文书
创业分两种人:那么哪些适合创业?,哪些适合不适合创业呢?
2019/08/23 职场文书
微软Win11有哪些隐藏功能? windows11多个功能汇总
2021/11/21 数码科技
Java十分钟精通进阶适配器模式
2022/04/06 Java/Android