详解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 实现explort() 功能的详解
Jun 20 PHP
php 表单提交大量数据发生丢失的解决方法
Mar 03 PHP
zf框架的数据库追踪器使用示例
Mar 13 PHP
php实现的单一入口应用程序实例分析
Sep 23 PHP
详解PHP中instanceof关键字及instanceof关键字有什么作用
Nov 05 PHP
ECSHOP完美解决Deprecated: preg_replace()报错的问题
May 17 PHP
利用PHP如何写APP接口详解
Aug 23 PHP
PHP将字符串首字母大小写转换的实例
Jan 21 PHP
CI(CodeIgniter)框架视图中加载视图的方法
Mar 24 PHP
Laravel中unique和exists验证规则的优化详解
Jan 28 PHP
thinkPHP框架实现生成条形码的方法示例
Jun 06 PHP
PHP时间戳和日期相互转换操作实例小结
Dec 18 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
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
2015/06/17 PHP
php自定义函数实现JS的escape的方法示例
2016/07/07 PHP
PHP内置加密函数详解
2016/11/20 PHP
PHP中-&gt;和=&gt;的含义及使用示例解析
2020/08/06 PHP
JavaScript 学习笔记(十三)Dom创建表格
2010/01/21 Javascript
Javascript笔记一 js以及json基础使用说明
2010/05/22 Javascript
如何让easyui gridview 宽度自适应窗口改变及fitColumns应用
2013/01/25 Javascript
jquery submit ie6下失效的原因分析及解决方法
2013/11/15 Javascript
浅谈js中的闭包
2015/03/16 Javascript
JavaScript判断FileUpload控件上传文件类型
2015/09/28 Javascript
比较常见的javascript中定义函数的区别
2015/11/09 Javascript
javascript三种代码注释方法
2016/06/02 Javascript
AngularJS中的包含详细介绍及实现示例
2016/07/28 Javascript
AngularJS基础 ng-cloak 指令简单示例
2016/08/01 Javascript
vue实现添加标签demo示例代码
2017/01/21 Javascript
Bootstrap fileinput文件上传预览插件使用详解
2017/05/16 Javascript
node.js文件上传重命名以及移动位置的示例代码
2018/01/19 Javascript
Express本地测试HTTPS的示例代码
2018/06/06 Javascript
[01:02:06]LGD vs Mineski Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
[48:31]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第二场 12.17
2020/12/19 DOTA
详解Python3中字符串中的数字提取方法
2017/01/14 Python
python函数式编程学习之yield表达式形式详解
2018/03/25 Python
Python Matplotlib库安装与基本作图示例
2019/01/09 Python
pandas DataFrame 删除重复的行的实现方法
2019/01/29 Python
Django框架model模型对象验证实现方法分析
2019/10/02 Python
Python 实现OpenCV格式和PIL.Image格式互转
2020/01/09 Python
Python中Yield的基本用法
2020/10/18 Python
HTML5 WebSocket实现点对点聊天的示例代码
2018/01/31 HTML / CSS
找到您丢失的钥匙、钱包和手机:Tile
2017/05/19 全球购物
NFL官方在线商店:NFLShop
2020/07/29 全球购物
产品质量承诺书范文
2014/03/27 职场文书
营销与策划专业求职信
2014/06/20 职场文书
银行党员批评与自我批评
2014/10/15 职场文书
小学教师节活动总结
2015/03/20 职场文书
幼儿园大班教学反思
2016/03/02 职场文书
解除租赁合同协议书
2016/03/21 职场文书