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中文乱码怎么办如何让浏览器自动识别utf-8
Jan 15 PHP
使用PHP强制下载PDF文件示例
Jan 17 PHP
PHP+memcache实现消息队列案例分享
May 21 PHP
php析构函数的简单使用说明
Aug 24 PHP
php中namespace及use用法分析
Dec 06 PHP
php+webSoket实现聊天室示例代码(附源码)
Feb 17 PHP
[原创]php使用strpos判断字符串中数字类型子字符串出错的解决方法
Apr 01 PHP
laravel 5.3中自定义加密服务的方案详解
May 09 PHP
基于swoole实现多人聊天室
Jun 14 PHP
Laravel 连接(Join)示例
Oct 16 PHP
PHP设计模式之 策略模式Strategy详解【对象行为型】
May 01 PHP
详解Go与PHP的语法对比
May 29 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
phpmailer中文乱码问题的解决方法
2014/04/22 PHP
PHP中exec函数和shell_exec函数的区别
2014/08/20 PHP
PHP采用curl模仿用户登陆新浪微博发微博的方法
2014/11/07 PHP
Laravel 中获取上一篇和下一篇数据
2015/07/27 PHP
Yii2框架加载css和js文件的方法分析
2019/05/25 PHP
js左侧多级菜单动态的解决方案
2010/02/01 Javascript
手机平板等移动端适配跳转URL的js代码
2014/01/25 Javascript
jQuery的选择器中的通配符使用介绍
2014/03/20 Javascript
JS实现固定在右下角可展开收缩DIV层的方法
2015/02/13 Javascript
使用javascript将时间转换成今天,昨天,前天等格式
2015/06/25 Javascript
jQuery基于cookie实现的购物车实例分析
2015/12/24 Javascript
简单谈谈Vue 模板各类数据绑定
2016/09/25 Javascript
Vue.js第四天学习笔记(组件)
2016/12/02 Javascript
ES6新特性二:Iterator(遍历器)和for-of循环详解
2017/04/20 Javascript
angular json对象push到数组中的方法
2018/02/27 Javascript
详解如何在nuxt中添加proxyTable代理
2018/08/10 Javascript
如何提升vue.js中大型数据的性能
2019/06/21 Javascript
layui上传图片到服务器的非项目目录下的方法
2019/09/26 Javascript
Vuex的实战使用详解
2019/10/31 Javascript
vue中template的三种写法示例
2020/10/21 Javascript
python编码总结(编码类型、格式、转码)
2016/07/01 Python
Python实现删除排序数组中重复项的两种方法示例
2019/01/31 Python
在linux下实现 python 监控usb设备信号
2019/07/03 Python
python使用pygame实现笑脸乒乓球弹珠球游戏
2019/11/25 Python
树莓派升级python的具体步骤
2020/07/05 Python
python 牛顿法实现逻辑回归(Logistic Regression)
2020/10/15 Python
python中判断数字是否为质数的实例讲解
2020/12/06 Python
css3实现背景颜色渐变让图片不再是唯一的实现方式
2012/12/18 HTML / CSS
旅游管理本科生求职信
2013/10/14 职场文书
计算机专业自我鉴定
2013/10/15 职场文书
会计演讲稿范文
2014/05/23 职场文书
2014年政府采购工作总结
2014/12/09 职场文书
2014年行政执法工作总结
2014/12/11 职场文书
如何在centos上使用yum安装rabbitmq-server
2021/03/31 Servers
JavaScript canvas实现流星特效
2021/05/20 Javascript