php auotload 实现了类的延迟加载机制,需要的时候在include,平时很少用到。它的实现原理搜了一下如下(不是本人研究的结果):

  1. 检查执行器全局变量函数指针autoload_func是否为NULL。
  2. 如果autoload_func==NULL, 则查找系统中是否定义有__autoload()函数,如果没有,则报告错误并退出。
  3. 如果定义了__autoload()函数,则执行__autoload()尝试加载类,并返回加载结果。
  4. 如果autoload_func不为NULL,则直接执行autoload_func指针指向的函数用来加载类。注意此时并不检查__autoload()函数是否定义。

  PHP提供了两种方法来实现自动装载机制,php的autoload,另外 一种就是设计一个函数,将autoload_func指针指向它,这通常使用C语言在PHP扩展中实现。如果既实现了__autoload()函数,又实现了autoload_func(将autoload_func指向某一PHP函数),那么只执行autoload_func函数。

  php 的 autoload 不是很灵活,一个项目只有一个!想要实现多种多样的自动加载机制,autoload就好很长,不便维护。于是有了SPL autoload php的扩展。

class Tool
{
public static function auto($class)
{
$filename = $class.'.php';
require $filename;
}
} spl_autoload_register(array('Tool','auto'));
spl_autoload_register(array('Kohana', 'auto_load'));

可以注册多个autoload ,上一个加载不到,会从下一个找。

  spl_autoload_call本身的实现很简单,只是简单的按顺序执行这个链表中每个函数,在每个函数执行完成后都判断一次需要的类是否已经加载, 如果加载成功就直接返回,不再继续执行链表中的其它函数。如果这个链表中所有的函数都执行完成后类还没有加载,spl_autoload_call就直接 退出,并不向用户报告错误。因此,使用了autoload机制,并不能保证类就一定能正确的自动加载,关键还是要看你的自动加载函数如何实现。

  spl_autoload_register函数可以将用户定义的自动加载函数注册到这个链表中,并将autoload_func函数指针指向spl_autoload_call函数。也可以通过spl_autoload_unregister函数将已经注册的函数从autoload_functions链表中删除

php autoload 笔记的更多相关文章

  1. CI框架源码阅读笔记9 CI的自动加载机制autoload

    本篇并不是对某一组件的详细源码分析,而只是简单的跟踪了下CI的autoload的基本流程.因此,可以看做是Loader组件的分析前篇. CI框架中,允许你配置autoload数组,这样,在你的应用程序 ...

  2. PHP学习笔记(3) - 奇怪的class与autoload

    PHP的class与其他语言有很多不同点.PHP允许很奇葩的在静态方法中调用实例方法,提供了关键字self和static用于访问类自身的静态成员.self永远是指当前的类,而static则可能会变成指 ...

  3. 两千行PHP学习笔记

    亲们,如约而至的PHP笔记来啦~绝对干货! 以下为我以前学PHP时做的笔记,时不时的也会添加一些基础知识点进去,有时还翻出来查查. MySQL笔记:一千行MySQL学习笔记http://www.cnb ...

  4. 转:openwrt中luci学习笔记

    原文地址:openwrt中luci学习笔记 最近在学习OpenWrt,需要在OpenWrt的WEB界面增加内容,本文将讲述修改OpenWrt的过程和其中遇到的问题. 一.WEB界面开发         ...

  5. extjs笔记

      1.    ExtJs 结构树.. 2 2.    对ExtJs的态度.. 3 3.    Ext.form概述.. 4 4.    Ext.TabPanel篇.. 5 5.    Functio ...

  6. lfs(systemd版本)学习笔记-第3页

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! lfs(systemd)学习笔记-第2页 的地址:https://www.cnblogs.com/renren-study-no ...

  7. lfs(systemv版本)学习笔记-第3页

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! lfs(systemv版本)学习笔记-第2页的地址:https://www.cnblogs.com/renren-study-n ...

  8. vim神器(学习笔记)

    #本文并非原创,属于本人学习中的记录笔记或是转存笔记,如果涉及到哪位高人的创作权益,敬请海涵! Vim 是一个上古神器,本篇文章主要持续总结使用 Vim 的过程中不得不了解的一些指令和注意事项,以及持 ...

  9. laravel 5.6初学笔记

    laravel 5.6初学笔记 http://note.youdao.com/noteshare?id=bf4b701b49dd035564e7145ba2d978b4 框架简介 laravel文档齐 ...

随机推荐

  1. EasyUI使用小常识

    datagrid:1 //显示某列 $('#ListTable').datagrid('showColumn', 'ExRate'); //隐藏某列 $('#ListTable').datagrid( ...

  2. HDU-5222 Exploration(拓扑排序)

    一.题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5222 二.题意 给一个无向边+有向边的混合图,其中每条边只能使用一次,问图中是否存在环. 三.思路 ...

  3. javascript的propertyIsEnumerable()方法

    /* propertyIsEnumerable()是用来检测属性是否属于某个对象的,如果检测到了,返回true,否则返回false. 1.这个属性必须属于实例的,并且不属于原型. 2.这个属性必须是可 ...

  4. Python的设计哲学

    Beautiful is better than ugly. 优美胜于丑陋 Explicit is better than implicit. 明了胜于晦涩 Simple is better than ...

  5. solr搜索之搜索精度问题我已经尽力了!!!

    solr搞了好久了,没啥进展,没啥大的突破,但是我真的尽力了! solr7可能是把默认搜索方式去掉了,如下: 在solr7里找了半天以及各种查资料也没发现这个默认搜索方式,后来想,可能是被edisma ...

  6. 开始Django之旅

    MTV 与 MVC 模型 1.MVC模型 Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为 模型(M) ,控制器(C) 和 视图(V) 三层,他们之间以一种插件式的.松耦合的方式 ...

  7. multipart/form-data boundary 说明

    含义 ENCTYPE="multipart/form-data" 说明: 通过 http 协议上传文件 rfc1867协议概述,jsp 应用举例,客户端发送内容构造 1.概述在最初 ...

  8. 跟我学算法-吴恩达老师(mini-batchsize,指数加权平均,Momentum 梯度下降法,RMS prop, Adam 优化算法, Learning rate decay)

    1.mini-batch size 表示每次都只筛选一部分作为训练的样本,进行训练,遍历一次样本的次数为(样本数/单次样本数目) 当mini-batch size 的数量通常介于1,m 之间    当 ...

  9. 【318】C# 学习笔记

    笔记 01:C# 数据结构 引用类型(Reference types) 引用类型不包含存储在变量中的实际数据,但它们包含对变量的引用. 换句话说,它们指的是一个内存位置.使用多个变量时,引用类型可以指 ...

  10. 初步认识cookie

    cookie是由服务器创建,客户端读取及保存它的 同类请求指的是资源路径相同 Cookie的默认路径绑定是所请求的资源路径绑定的 ,指定路径时必须要有项目名称(说明是哪个项目) 使用cookie时还要 ...