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 google或baidu分页代码
Nov 26 PHP
九个你必须知道而且又很好用的php函数和特点
Aug 08 PHP
使用php记录用户通过搜索引擎进网站的关键词
Feb 13 PHP
php实现文件下载实例分享
Jun 02 PHP
PHP获取MySql新增记录ID值的3种方法
Jun 24 PHP
PHP判断网络文件是否存在的方法
Mar 12 PHP
一个简单的php MVC留言本实例代码(必看篇)
Sep 22 PHP
php自定义函数实现统计中文字符串长度的方法小结
Apr 15 PHP
小程序微信支付功能配置方法示例详解【基于thinkPHP】
May 05 PHP
PHP实现的AES 128位加密算法示例
Sep 16 PHP
PHP SESSION跨页面传递失败解决方案
Dec 11 PHP
PHP执行系统命令函数实例讲解
Mar 03 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设计模式 Singleton(单例模式)
2011/06/26 PHP
smarty高级特性之过滤器的使用方法
2015/12/25 PHP
php获得刚插入数据的id 的几种方法总结
2018/05/31 PHP
PHP过滤器 filter_has_var() 函数用法实例分析
2020/04/23 PHP
jQuery插件开发基础简单介绍
2013/01/07 Javascript
ExtJs默认的字体大小改变的几种方法(自己整理)
2013/04/18 Javascript
js 对小数加法精度处理示例说明
2013/12/27 Javascript
JavaScript中按位“异或”运算符使用介绍
2014/03/14 Javascript
浅谈Javascript实现继承的方法
2015/07/06 Javascript
基于javascript实现漂亮的页面过渡动画效果附源码下载
2015/10/26 Javascript
jQuery实时显示鼠标指针位置和键盘ASCII码
2016/03/28 Javascript
jQuery Ajax 实例代码 ($.ajax、$.post、$.get)
2016/04/29 Javascript
使用伪命名空间封装保护独自创建的对象方法
2016/08/04 Javascript
Bootstrap模态框(Modal)实现过渡效果
2017/03/17 Javascript
VUE 全局变量的几种实现方式
2018/08/22 Javascript
vue+element导航栏高亮显示的解决方式
2019/11/12 Javascript
[05:20]卡尔工作室_DOTA2新手教学_DOTA2超强新手功能
2013/04/22 DOTA
python 测试实现方法
2008/12/24 Python
python3 kmp 字符串匹配的方法
2018/07/07 Python
django多对多表的创建,级联删除及手动创建第三张表
2019/07/25 Python
python使用yield压平嵌套字典的超简单方法
2019/11/02 Python
Python PyQt5模块实现窗口GUI界面代码实例
2020/05/12 Python
python搜索算法原理及实例讲解
2020/11/18 Python
美国医生配方营养补充剂供应商:Healthy Directions
2019/07/10 全球购物
美国最大的购物网站:Amazon.com(亚马逊美国)
2020/05/23 全球购物
外贸业务员求职自荐信分享
2013/09/21 职场文书
出生医学证明样本
2014/01/17 职场文书
青年文明号事迹材料
2014/01/18 职场文书
超市开学活动方案
2014/03/01 职场文书
节能标语大全
2014/06/21 职场文书
医学专业毕业生推荐信
2014/07/12 职场文书
大学生国庆节65周年演讲稿范文
2014/09/25 职场文书
教师政风行风自查自纠报告
2014/10/21 职场文书
作风建设年度心得体会
2014/10/29 职场文书
教你怎么用PyCharm为同一服务器配置多个python解释器
2021/05/31 Python
Python中的socket网络模块介绍
2022/07/23 Python