详解PHP文件的自动加载(autoloading)


Posted in PHP onFebruary 04, 2018

传统上,在PHP里,当我们要用到一个class文件的时候,我们都得在文档头部require或者include一下:

<?php
require_once('../includes/functions.php');
require_once('../includes/database.php');
require_once('../includes/user.php');
...

但是一旦要调用的文档多了,就得每次都写一行,瞅着也不美观,有什么办法能让PHP文档自动加载呢?

<?php
function __autoload($class_name)
{
  require "./{$class_name}.php";
}

对,可以使用PHP的魔法函数__autoload(),上面的示例就是自动加载当前目录下的PHP文件。当然,实际当中,我们更可能会这么来使用:

<?php
function __autoload($class_name)
{
  $name = strtolower($class_name);
  $path = "../includes/{$name}.php";
  
  if(file_exists($path)){
     require_once($path);
    }else{
      die("the file {$class_name} could not be found");
    }
}

也即是做了一定的文件名大小写处理,然后在require之前检查文件是否存在,不存在的话显示自定义的信息。

类似用法经常在私人项目,或者说是单一项目的框架中见到,为什么呢?因为你只能定义一个__autoload function,在多人开发中,做不到不同的developer使用不同的自定义的autoloader,除非大家都提前说好了,都使用一个__autoload,涉及到改动了就进行版本同步,这很麻烦。

也主要是因为此,有个好消息,就是这个__autoload函数马上要在7.2版本的PHP中弃用了。

Warning This feature has been DEPRECATED as of PHP 7.2.0. Relying on this feature is highly discouraged.
那么取而代之的是一个叫spl_autoload_register()的东东,它的好处是可以自定义多个autoloader.

//使用匿名函数来autoload
spl_autoload_register(function($class_name){
  require_once('...');
});
//使用一个全局函数
function Custom()
{
  require_once('...');
}

spl_autoload_register('Custom');
//使用一个class当中的static方法
class MyCustomAutoloader
{
  static public function myLoader($class_name)
  {
    require_once('...');    
  }
}

//传array进来,第一个是class名,第二个是方法名
spl_autoload_register(['MyCustomAutoloader','myLoader']);
//甚至也可以用在实例化的object上
class MyCustomAutoloader
{
  public function myLoader($class_name)
  {
  }
}

$object = new MyCustomAutoloader;
spl_autoload_register([$object,'myLoader']);

值得一提的是,使用autoload,无论是__autoload(),还是spl_autoload_register(),相比于require或include,好处就是autoload机制是lazy loading,也即是并不是你一运行就给你调用所有的那些文件,而是只有你用到了哪个,比如说new了哪个文件以后,才会通过autoload机制去加载相应文件。

当然,laravel包括各个package里也是经常用到spl_autoload_register,比如这里:

/**
 * Prepend the load method to the auto-loader stack.
 *
 * @return void
 */
protected function prependToLoaderStack()
{
  spl_autoload_register([$this, 'load'], true, true);
}
PHP 相关文章推荐
MySql中正则表达式的使用方法描述
Jul 30 PHP
php db类库进行数据库操作
Mar 19 PHP
用php实现选择排序的解决方法
May 04 PHP
深入解析php中的foreach函数
Aug 31 PHP
php实现Mongodb自定义方式生成自增ID的方法
Mar 23 PHP
PHP使用flock实现文件加锁的方法
Jul 01 PHP
php 时间time与日期date之间的使用详解及区别
Nov 07 PHP
php 基础函数
Feb 10 PHP
PHP函数rtrim()使用中的怪异现象分析
Feb 24 PHP
cakephp常见知识点汇总
Feb 24 PHP
详解PHP实现支付宝小程序用户授权的工具类
Dec 25 PHP
一文搞懂PHP中的抽象类和接口
May 25 PHP
PHP实现QQ登录的开原理和实现过程
Feb 04 #PHP
PHP实现正则表达式分组捕获操作示例
Feb 03 #PHP
php实现解析xml并生成sql语句的方法
Feb 03 #PHP
PHP删除数组中指定下标的元素方法
Feb 03 #PHP
php学习笔记之mb_strstr的基本使用
Feb 03 #PHP
php通过pecl方式安装扩展的实例讲解
Feb 02 #PHP
PHP实现对图片的反色处理功能【测试可用】
Feb 01 #PHP
You might like
PHP实现根据数组的值进行分组的方法
2017/04/20 PHP
PHP守护进程化在C和PHP环境下的实现
2017/11/21 PHP
javascript如何使用bind指定接收者
2014/05/04 Javascript
JavaScript中的公有、私有、特权和静态成员用法分析
2014/11/20 Javascript
JavaScript使用cookie记录临时访客信息的方法
2015/04/07 Javascript
javascript跨域原因以及解决方案分享
2015/04/08 Javascript
js实现不提交表单获取单选按钮值的方法
2015/08/21 Javascript
js图片轮播特效代码分享
2015/09/07 Javascript
每天一篇javascript学习小结(Array数组)
2015/11/11 Javascript
javascript实现对表格元素进行排序操作
2015/11/18 Javascript
jQuery无刷新上传之uploadify简单代码
2017/01/17 Javascript
BootstrapTable请求数据时设置超时(timeout)的方法
2017/01/22 Javascript
ES6中Proxy代理用法实例浅析
2017/04/06 Javascript
使用JS组件实现带ToolTip验证框的实例代码
2017/08/23 Javascript
Django中使用jquery的ajax进行数据交互的实例代码
2017/10/15 jQuery
Vue+Vux项目实践完整代码
2017/11/30 Javascript
JavaScript实现点击出现图片并统计点击次数功能示例
2018/07/23 Javascript
vue实现同一个页面可以有多个router-view的方法
2018/09/20 Javascript
js中自定义react数据验证组件实例详解
2018/10/19 Javascript
Js实现粘贴上传图片的原理及示例
2020/12/09 Javascript
[01:28:43]2014 DOTA2华西杯精英邀请赛5 24 DK VS CIS
2014/05/25 DOTA
[06:20]2015国际邀请赛第三日top10
2015/08/08 DOTA
python基于xml parse实现解析cdatasection数据
2014/09/30 Python
Python之Web框架Django项目搭建全过程
2017/05/02 Python
浅谈Python由__dict__和dir()引发的一些思考
2017/10/30 Python
Python中XlsxWriter模块简介与用法分析
2018/04/24 Python
Python 使用threading+Queue实现线程池示例
2019/12/21 Python
彻底搞懂 python 中文乱码问题(深入分析)
2020/02/28 Python
python3中sys.argv的实例用法
2020/04/24 Python
html5 分层屏幕适配的方法
2018/03/16 HTML / CSS
HTML5 拖放功能实现代码
2016/07/14 HTML / CSS
iRobot官网:改变生活的家用机器人品牌
2016/09/20 全球购物
Skyscanner新西兰:全球领先的旅游搜索网站
2019/08/26 全球购物
人民调解协议书范本
2014/10/11 职场文书
初中体育教学随笔
2015/08/15 职场文书
pytorch中Schedule与warmup_steps的用法说明
2021/05/24 Python