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通用检测函数集合
Nov 25 PHP
一些php项目中比较通用的php自建函数的详解
Jun 06 PHP
php连接Access数据库错误及解决方法
Jun 20 PHP
php读取本地文件常用函数(fopen与file_get_contents)
Sep 09 PHP
使用Discuz关键词服务器实现PHP中文分词
Mar 11 PHP
php中实现xml与mysql数据相互转换的方法
Dec 25 PHP
PHP设计模式之装饰者模式代码实例
May 11 PHP
PHP代码判断设备是手机还是平板电脑(两种方法)
Oct 19 PHP
PHP实现统计在线人数功能示例
Oct 15 PHP
php实现博客,论坛图片防盗链的方法
Oct 15 PHP
PHP实现模拟http请求的方法分析
Dec 20 PHP
PHP文件上传小程序 适合初学者学习!
May 23 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 需要掌握的东西 不做浮躁的人
2009/12/28 PHP
Fine Uploader文件上传组件应用介绍
2013/01/06 PHP
php使用gzip压缩传输js和css文件的方法
2015/07/29 PHP
php数组冒泡排序算法实例
2016/05/06 PHP
thinkphp框架实现数据添加和显示功能
2016/06/29 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
2018/04/20 PHP
宝塔面板在NGINX环境中TP5.1如何运行?
2021/03/09 PHP
Javascript的各种节点操作实例演示代码
2012/06/27 Javascript
javascript跟随滚动效果插件代码(javascript Follow Plugin)
2013/08/03 Javascript
javascript 树形导航菜单实例代码
2013/08/13 Javascript
iframe窗口高度自适应的又一个巧妙实现思路
2014/04/04 Javascript
Javascript单元测试框架QUnitjs详细介绍
2014/05/08 Javascript
基于javascript实现仿百度输入框自动匹配功能
2016/01/03 Javascript
Javascript实现图片轮播效果(二)图片序列节点的控制实现
2016/02/17 Javascript
jQuery实现两个select控件的互移操作
2016/12/22 Javascript
js/jQuery实现全选效果
2019/06/17 jQuery
vue用BMap百度地图实现即时搜索功能
2019/09/26 Javascript
Vuex的API文档说明详解
2020/02/05 Javascript
解决vue动态路由异步加载import组件,加载不到module的问题
2020/07/26 Javascript
[49:35]2018DOTA2亚洲邀请赛3月30日 小组赛A组 KG VS TNC
2018/03/31 DOTA
Python的ORM框架SQLObject入门实例
2014/04/28 Python
使用Python中的线程进行网络编程的入门教程
2015/04/15 Python
详解Django框架中的视图级缓存
2015/07/23 Python
Windows中安装使用Virtualenv来创建独立Python环境
2016/05/31 Python
Python实现比较扑克牌大小程序代码示例
2017/12/06 Python
Python中的CSV文件使用&quot;with&quot;语句的方式详解
2018/10/16 Python
对python mayavi三维绘图的实现详解
2019/01/08 Python
如何使用django的MTV开发模式返回一个网页
2019/07/22 Python
简单了解python filter、map、reduce的区别
2020/01/14 Python
使用PyQt的QLabel组件实现选定目标框功能的方法示例
2020/05/19 Python
FC-Moto丹麦:欧洲最大的摩托车服装和头盔商店之一
2019/08/20 全球购物
internal修饰符起什么作用
2013/12/16 面试题
优秀经理获奖感言
2014/03/04 职场文书
机关办公室岗位职责
2014/04/16 职场文书
中文专业毕业生自荐信
2014/05/24 职场文书
研究生导师推荐信
2015/03/25 职场文书