详解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 相关文章推荐
Php部分常见问题总结
Oct 09 PHP
php 文件上传类代码
Aug 06 PHP
phpmail类发送邮件函数代码
Feb 20 PHP
php 中的4种标记风格介绍
May 10 PHP
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
Apr 08 PHP
PHP+memcache实现消息队列案例分享
May 21 PHP
跟我学Laravel之视图 &amp; Response
Oct 15 PHP
php实现html标签闭合检测与修复方法
Jul 09 PHP
Symfony2联合查询实现方法
Mar 18 PHP
php时间函数用法分析
May 28 PHP
基于ThinkPHP5.0实现图片上传插件
Sep 25 PHP
PHP实现一维数组与二维数组去重功能示例
May 24 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
ionCube 一款类似zend的PHP加密/解密工具
2010/07/25 PHP
Linux下安装PHP MSSQL扩展教程
2014/10/24 PHP
Yii2 批量插入、更新数据实例
2017/03/15 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
静态的动态续篇之来点XML
2006/08/15 Javascript
检测jQuery.js是否已加载的判断代码
2011/05/20 Javascript
JavaScript在XHTML中的用法详解
2013/04/11 Javascript
JavaScript字符串对象substring方法入门实例(用于截取字符串)
2014/10/17 Javascript
基于jquery和svg实现超炫酷的动画特效
2014/12/09 Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
2014/12/29 Javascript
JS简单计算器实例
2015/01/20 Javascript
JavaScript基础函数整理汇总
2015/01/30 Javascript
JavaScript File API文件上传预览
2016/02/02 Javascript
Bootstrap的fileinput插件实现多文件上传的方法
2016/09/05 Javascript
浅谈js的异步执行
2016/10/18 Javascript
js如何编写简单的ajax方法库
2017/08/02 Javascript
如何去除vue项目中的#及其ie9兼容性
2018/01/11 Javascript
JS实现移动端触屏拖拽功能
2018/07/31 Javascript
[45:18]完美世界DOTA2联赛循环赛 PXG vs IO 第二场 11.06
2020/11/09 DOTA
深入理解python中的浅拷贝和深拷贝
2016/05/30 Python
利用Python将每日一句定时推送至微信的实现方法
2018/08/13 Python
Python 比较文本相似性的方法(difflib,Levenshtein)
2018/10/15 Python
Pandas过滤dataframe中包含特定字符串的数据方法
2018/11/07 Python
对python的输出和输出格式详解
2018/12/08 Python
python算法题 链表反转详解
2019/07/02 Python
IronPython连接MySQL的方法步骤
2019/12/27 Python
用python对excel进行操作(读,写,修改)
2020/12/25 Python
美国第一个网上卖鞋零售商:OnlineShoes.com
2017/09/24 全球购物
Spartoo美国:欧洲排名第一的在线时装零售商
2019/12/12 全球购物
学生个人求职自荐信格式
2013/09/23 职场文书
外贸采购员求职的自我评价
2013/11/26 职场文书
采购主管岗位职责
2014/02/01 职场文书
中学生国旗下讲话稿
2014/04/26 职场文书
2016大学生就业指导课心得体会
2016/01/15 职场文书
新手必备之MySQL msi版本下载安装图文详细教程
2021/05/21 MySQL
十大最帅动漫男主 碓冰拓海上榜,第一是《灌篮高手》男主角
2022/03/18 日漫