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 相关文章推荐
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
Apr 18 PHP
php 生成唯一id的几种解决方法
Mar 08 PHP
基于header的一些常用指令详解
Jun 06 PHP
如何在smarty中增加类似foreach的功能自动加载数据
Jun 26 PHP
PHP防止跨域提交表单
Nov 01 PHP
Yii获取当前url和域名的方法
Jun 08 PHP
php + nginx项目中的权限详解
May 23 PHP
PHP laravel中的多对多关系实例详解
Jun 07 PHP
PHP更安全的密码加密机制Bcrypt详解
Jun 18 PHP
PHP实现求解最长公共子串问题的方法
Nov 17 PHP
PHP定义字符串的四种方式详解
Feb 06 PHP
PHP 面向对象程序设计之类属性与类常量实现方法分析
Apr 13 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下MAIL的另一解决方案
2006/10/09 PHP
php google或baidu分页代码
2009/11/26 PHP
PHP中改变图片的尺寸大小的代码
2011/07/17 PHP
ajax取消挂起请求的处理方法
2013/03/18 PHP
PHP mysql事务问题实例分析
2016/01/18 PHP
zen_cart实现支付前生成订单的方法
2016/05/06 PHP
php连接oracle数据库的方法(测试成功)
2016/05/26 PHP
yii2 数据库读写分离配置示例
2017/02/10 PHP
PHP远程连接oracle数据库操作实现方法图文详解
2019/04/11 PHP
Javascript 遮罩层和加载效果代码
2013/08/01 Javascript
JavaScript/Js脚本处理html元素的自定义属性解析(亲测兼容Firefox与IE)
2013/11/25 Javascript
用javascript替换URL中的参数值示例代码
2014/01/27 Javascript
JS实现div居中示例
2014/04/17 Javascript
jQuery中wrapAll()方法用法实例
2015/01/16 Javascript
基于angular实现模拟微信小程序swiper组件
2017/06/11 Javascript
vue2.0在没有dev-server.js下的本地数据配置方法
2018/02/23 Javascript
JS获取input[file]的值并显示在页面的实现方法
2018/03/09 Javascript
nodejs 简单实现动态html的方法
2018/05/12 NodeJs
详解vue-cli 2.0配置文件(小结)
2019/01/14 Javascript
微信小程序indexOf的替换方法(推荐)
2020/01/14 Javascript
用Python编程实现语音控制电脑
2014/04/01 Python
pandas带有重复索引操作方法
2018/06/08 Python
TensorFlow的权值更新方法
2018/06/14 Python
Python socket套接字实现C/S模式远程命令执行功能案例
2018/07/06 Python
解决python3读取Python2存储的pickle文件问题
2018/10/25 Python
Python基础之字典常见操作经典实例详解
2020/02/26 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
2020/09/14 Python
Python字符串对齐、删除字符串不需要的内容以及格式化打印字符
2021/01/23 Python
HTML5 File API改善网页上传功能
2009/08/19 HTML / CSS
薇姿法国官网:Vichy法国
2021/01/28 全球购物
关于元旦的广播稿
2014/02/16 职场文书
乡镇计划生育工作汇报
2014/10/28 职场文书
给老婆的道歉信
2015/01/20 职场文书
清空 Oracle 安装记录并重新安装
2022/04/26 Oracle
Vue深入理解插槽slot的使用
2022/08/05 Vue.js
苹果macOS 13开发者预览版Beta 8发布 正式版10月发布
2022/09/23 数码科技