PHP函数spl_autoload_register()用法和__autoload()介绍


Posted in PHP onFebruary 04, 2012

__autoload()的用法就不再说了,以前已经在我的WEB开发笔记中说过。PHP __autoload函数(自动载入类文件)的使用方法, 原文地址:https://3water.com/article/29625.htm 。

说一说,spl_autoload_register()的用法吧,很简单,可以这样理解,就是声明一个自定义__autoload(),你可以是A函数,也可以是B函数,想怎么样就怎么样,函数体的写法,当然要和__autoload()一样就OK 了。

当PHP找不到类文件会调用这个方法,当注册了自己的函数或方法时,PHP不会调用__autoload()函数,而会调用自定义的函数

spl_autoload_register(‘func_name');
spl_autoload_register(array(‘class_name','method_name'));

详细说明如下:

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指向这两个不同的函数地址来实现不同的自动加载机制。

代码如下:

test.class.php

<?php 
class abc{ 
function __construct() 
{ 
echo 'www.chhua.com; 
} 
} 
?>

load.php

<?php 
class LOAD 
{ 
static function loadClass($class_name) 
{ 
$filename = $class_name.".class.php"; 
if (is_file($filename)) return include_once $filename; 
} 
} 
/** 
* 设置对象的自动载入 
* spl_autoload_register — Register given function as __autoload() implementation 
*/ 
spl_autoload_register(array('LOAD', 'loadClass')); 
$a = new Test();//实现自动加载,很多框架就用这种方法自动加载类 
?>

spl_autoload_register装载函数的正确写法

AutoLoading\loading

<?php
namespace AutoLoading;

class Loadind {
 public static function autoload($className){
        //根据PSR-O的第4点 把 \ 转换层(目录风格符)   DIRECTORY_SEPARATOR , 
    //便于兼容Linux文件找。Windows 下(/ 和 \)是通用的
    //由于namspace 很规格,所以直接很快就能找到
    $fileName = str_replace('\\', DIRECTORY_SEPARATOR, DIR . '\\'. $className) . '.php';
    if (is_file($fileName)) {
      require $fileName;
    } else {
      echo $fileName . ' is not exist'; die;
    }    }   
}

index.php

//定义当前的目录绝对路径
define('DIR', dirname(__FILE__));
//加载这个文件
require DIR . '/loading.php';
//采用`命名空间`的方式注册。php 5.3 加入的
//也必须是得是static静态方法调用,然后就像加载namespace的方式调用,注意:不能使用use
spl_autoload_register("\\AutoLoading\\loading::autoload"); 
// 调用三个namespace类
//定位到Lib目录下的Name.php 
Lib\Name::test();
//定位到App目录下Android目录下的Name.php
App\Android\Name::test();
//定位到App目录下Ios目录下的Name.php
App\Ios\Name::test();
PHP 相关文章推荐
用PHP制作静态网站的模板框架
Oct 09 PHP
攻克CakePHP系列三 表单数据增删改
Oct 22 PHP
PHPWind 发帖回帖Api PHP版打包下载
Feb 08 PHP
PHP Zip解压 文件在线解压缩的函数代码
May 26 PHP
php curl模拟post请求小实例
Nov 13 PHP
PHP执行Curl时报错提示CURL ERROR: Recv failure: Connection reset by peer的解决方法
Jun 26 PHP
CodeIgniter中使用cookie的三种方式详解
Jul 18 PHP
解决ThinkPHP下使用上传插件Uploadify浏览器firefox报302错误的方法
Dec 18 PHP
PHPWind9.0手动屏蔽验证码解决后台关闭验证码但是依然显示的问题
Aug 12 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
May 13 PHP
Laravel解决nesting level错误和隐藏index.php的问题
Oct 12 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
Mar 26 PHP
PHP中的cookie不用刷新就生效的方法
Feb 04 #PHP
PHP对象转换为数组函数(递归方法)
Feb 04 #PHP
PHP投票系统防刷票判断流程分析
Feb 04 #PHP
php摘要生成函数(无乱码)
Feb 04 #PHP
写出高质量的PHP程序
Feb 04 #PHP
组合算法的PHP解答方法
Feb 04 #PHP
php处理斐波那契数列非递归方法
Feb 04 #PHP
You might like
PHP Warning: PHP Startup: Unable to load dynamic library \ D:/php5/ext/php_mysqli.dll\
2012/06/17 PHP
php5.3中连接sqlserver2000的两种方法(com与ODBC)
2012/12/29 PHP
学习php设计模式 php实现建造者模式
2015/12/07 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
2017/12/21 PHP
关于JavaScript定义类和对象的几种方式
2010/11/09 Javascript
javascript + jquery实现定时修改文章标题
2014/03/19 Javascript
javascript文本框内输入文字倒计数的方法
2015/02/24 Javascript
jQuery绑定事件on()与弹窗的简要概述
2016/04/27 Javascript
jQuery自制提示框tooltip改进版
2016/08/01 Javascript
JS判断鼠标进入容器的方向与window.open新窗口被拦截的问题
2016/12/23 Javascript
整理关于Bootstrap过渡动画的慕课笔记
2017/03/29 Javascript
Node.js发送HTTP客户端请求并显示响应结果的方法示例
2017/04/12 Javascript
vue-swiper的使用教程
2018/08/30 Javascript
jQuery 判断元素是否存在然后按需加载内容的实现代码
2020/01/16 jQuery
Vue登录拦截 登录后继续跳转指定页面的操作
2020/08/04 Javascript
[04:45]DOTA2上海特级锦标赛主赛事第四日RECAP
2016/03/06 DOTA
[49:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第二场 3月4日
2021/03/11 DOTA
python标准算法实现数组全排列的方法
2015/03/17 Python
python查看微信好友是否删除自己
2016/12/19 Python
Python爬虫实现抓取京东店铺信息及下载图片功能示例
2018/08/07 Python
Python中IP地址处理IPy模块的方法
2019/08/16 Python
django实现类似触发器的功能
2019/11/15 Python
Python内置加密模块用法解析
2019/11/25 Python
Tensorflow 1.0之后模型文件、权重数值的读取方式
2020/02/12 Python
H5离线存储Manifest原理及使用
2020/04/28 HTML / CSS
法国在线宠物店:zooplus.fr
2018/02/23 全球购物
iKRIX意大利网上商店:男女豪华服装和配件
2019/10/09 全球购物
班组长安全生产职责
2013/12/16 职场文书
写给老师的表扬信
2014/01/21 职场文书
运动会邀请函范文
2014/02/06 职场文书
软件工程毕业生自荐信
2014/07/04 职场文书
个人四风问题对照检查材料思想汇报
2014/10/06 职场文书
横店影视城导游词
2015/02/06 职场文书
汽车销售员工作总结
2015/08/12 职场文书
幼儿园六一儿童节开幕词
2016/03/04 职场文书
go web 预防跨站脚本的实现方式
2021/06/11 Golang