详解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 相关文章推荐
BBS(php &amp; mysql)完整版(四)
Oct 09 PHP
jq的get传参数在utf-8中乱码问题的解决php版
Jul 23 PHP
php 静态化实现代码
Mar 20 PHP
PHP Session变量不能传送到下一页的解决方法
Nov 27 PHP
PHP+javascript制作带提示的验证码源码分享
May 28 PHP
PHPStorm+XDebug进行调试图文教程
Jun 13 PHP
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
Dec 14 PHP
浅谈PHP面向对象之访问者模式+组合模式
May 22 PHP
php多文件打包下载的实例代码
Jul 12 PHP
Laravel构建即时应用的一种实现方法详解
Aug 31 PHP
php接口实现拖拽排序功能
Apr 23 PHP
php集成开发环境详解
Sep 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生成随机数或者字符串的代码
2008/09/05 PHP
PHP脚本中include文件出错解决方法
2008/11/20 PHP
使用XHGui来测试PHP性能的教程
2015/07/03 PHP
解决ThinkPHP下使用上传插件Uploadify浏览器firefox报302错误的方法
2015/12/18 PHP
thinkPHP5.0框架模块设计详解
2017/03/18 PHP
php生成0~1随机小数的方法(必看)
2017/04/05 PHP
JS常用函数使用指南
2014/11/23 Javascript
Backbone.js中的集合详解
2015/01/14 Javascript
关于验证码在IE中不刷新的快速解决方法
2016/09/23 Javascript
将input框中输入内容显示在相应的div中【三种方法可选】
2017/05/08 Javascript
es7学习教程之Decorators(修饰器)详解
2017/07/21 Javascript
从源码看angular/material2 中 dialog模块的实现方法
2017/10/18 Javascript
vue.js项目中实用的小技巧汇总
2017/11/29 Javascript
微信小程序使用request网络请求操作实例
2017/12/15 Javascript
jQuery+SpringMVC中的复选框选择与传值实例
2018/01/08 jQuery
在Vue中使用axios请求拦截的实现方法
2018/10/25 Javascript
Node.js Buffer模块功能及常用方法实例分析
2019/01/05 Javascript
利用JavaScript将Excel转换为JSON示例代码
2019/06/14 Javascript
使用python遍历指定城市的一周气温
2017/03/31 Python
Python实现复杂对象转JSON的方法示例
2017/06/22 Python
python简单实现矩阵的乘,加,转置和逆运算示例
2019/07/10 Python
Python实现Mysql数据统计及numpy统计函数
2019/07/15 Python
python之列表推导式的用法
2019/11/29 Python
Omio波兰:全欧洲低价大巴、火车和航班搜索和比价
2018/02/16 全球购物
美国酒店控股公司:Choice Hotels
2018/06/15 全球购物
多媒体编辑专业毕业生推荐信
2013/11/05 职场文书
车祸赔偿收入证明
2014/01/09 职场文书
展会邀请函范文
2014/01/26 职场文书
导购员的岗位职责
2014/02/08 职场文书
药品采购员岗位职责
2014/02/08 职场文书
2014年征兵标语
2014/06/20 职场文书
人事主管岗位职责说明书
2014/07/30 职场文书
打架检讨书
2015/01/27 职场文书
药店收银员岗位职责
2015/04/07 职场文书
家庭暴力离婚起诉书
2015/05/18 职场文书
CSS实现隐藏搜索框功能(动画正反向序列)
2021/07/21 HTML / CSS