详解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 相关文章推荐
smarty+adodb+部分自定义类的php开发模式
Dec 31 PHP
一个捕获函数输出的函数
Feb 14 PHP
php模板中出现空行解决方法
Mar 08 PHP
php提示无法加载或mcrypt没有找到 PHP 扩展 mbstring解决办法
Mar 27 PHP
php实现多张图片上传加水印技巧
Apr 18 PHP
深入php 正则表达式的学习探讨
Jun 06 PHP
Youku 视频绝对地址获取的方法详解
Jun 26 PHP
PHP定时任务延缓执行的实现
Oct 08 PHP
php自动提交表单的方法(基于fsockopen与curl)
May 09 PHP
PHP读取目录树的实现方法分析
Mar 22 PHP
PHP Pipeline 实现中间件的示例代码
Apr 26 PHP
如何在PHP中使用AES加密算法加密数据
Jun 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
PHP+.htaccess实现全站静态HTML文件GZIP压缩传输(一)
2007/02/15 PHP
基于MySQL到MongoDB简易对照表的详解
2013/06/03 PHP
深入理解PHP的远程多会话调试
2017/09/21 PHP
jquery关于页面焦点的定位(文本框获取焦点时改变样式 )
2010/09/10 Javascript
浅析LigerUi开发中谨慎载入common.css文件
2013/07/09 Javascript
jQuery防止click双击多次提交及传递动态函数或多参数
2014/04/02 Javascript
JavaScript取得键盘按下方向键是哪个的方法
2015/08/04 Javascript
针对初学者的jQuery入门指南
2015/08/15 Javascript
jquery实现图片预加载
2015/12/25 Javascript
详解javascript new的运行机制
2016/01/26 Javascript
基于JavaScript实现瀑布流效果
2017/03/29 Javascript
JS实现复选框的全选和批量删除功能
2017/04/05 Javascript
jQuery模拟实现天猫购物车动画效果实例代码
2017/05/25 jQuery
JavaScript原型继承_动力节点Java学院整理
2017/06/30 Javascript
用vue-cli开发vue时的代理设置方法
2018/09/20 Javascript
js数组相减简单示例【删除a数组所有与b数组相同元素】
2020/03/04 Javascript
vant 解决tab切换插件标题样式自定义的问题
2020/11/13 Javascript
利用python获取当前日期前后N天或N月日期的方法示例
2017/07/30 Python
Python基于time模块求程序运行时间的方法
2017/09/18 Python
python 二分查找和快速排序实例详解
2017/10/13 Python
python通过伪装头部数据抵抗反爬虫的实例
2018/05/07 Python
python pygame实现五子棋小游戏
2020/10/26 Python
浅谈Python小波分析库Pywavelets的一点使用心得
2019/07/09 Python
Python3 列表,数组,矩阵的相互转换的方法示例
2019/08/05 Python
TensorFlow实现打印每一层的输出
2020/01/21 Python
Python实现Kerberos用户的增删改查操作
2020/12/14 Python
Weekendesk意大利:探索多种引人入胜的周末主题
2016/10/14 全球购物
印尼网上商店:Alfacart.com
2019/03/11 全球购物
北大青鸟学生求职信
2013/09/24 职场文书
自荐信格式写作方法有哪些呢
2013/11/20 职场文书
艺术设计专业求职自荐信
2014/05/19 职场文书
竞选班长演讲稿400字
2014/08/22 职场文书
公司领导班子群众路线四风问题对照检查材料
2014/10/02 职场文书
Python中的套接字编程是什么?
2021/06/21 Python
vue组件冲突之引用另一个组件出现组件不显示的问题
2022/04/13 Vue.js
Win11如何默认打开软件界面最大化?Win11默认打开软件界面最大化的方法
2022/07/15 数码科技