详解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网页后退不再出现过期
Mar 08 PHP
apache+php完美解决301重定向的两种方法
Jun 08 PHP
php Smarty初体验二 获取配置信息
Aug 08 PHP
解析mysql中UNIX_TIMESTAMP()函数与php中time()函数的区别
Jun 24 PHP
关于使用key/value数据库redis和TTSERVER的心得体会
Jun 28 PHP
分享10段PHP常用代码
Nov 11 PHP
php实现的xml操作类
Jan 15 PHP
详谈php静态方法及普通方法的区别
Oct 04 PHP
PHP对象、模式与实践之高级特性分析
Dec 08 PHP
thinkPHP5.0框架环境变量配置方法
Mar 17 PHP
Laravel框架实现利用监听器进行sql语句记录功能
Jun 06 PHP
laravel5.1 ajax post 传值_token示例
Oct 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
利用phpexcel把excel导入数据库和数据库导出excel实现
2014/01/09 PHP
php批量修改表结构实例
2017/05/24 PHP
如何在PHP中生成随机数
2020/06/04 PHP
zTree插件之多选下拉菜单实例代码
2013/11/06 Javascript
JQuery中层次选择器用法实例详解
2015/05/18 Javascript
Websocket协议详解及简单实例代码
2016/12/12 Javascript
angular+ionic 的app上拉加载更新数据实现方法
2017/01/16 Javascript
使用weixin-java-tools完成微信授权登录、微信支付的示例
2018/09/26 Javascript
Vue中使用Lodop插件实现打印功能的简单方法
2019/12/19 Javascript
vue3+typeScript穿梭框的实现示例
2020/12/29 Vue.js
用Python编写一个简单的Lisp解释器的教程
2015/04/03 Python
Python中动态创建类实例的方法
2017/03/24 Python
Python爬虫之网页图片抓取的方法
2018/07/16 Python
Django框架使用mysql视图操作示例
2019/05/15 Python
python3.6 tkinter实现屏保小程序
2019/07/30 Python
Numpy之将矩阵拉成向量的实例
2019/11/30 Python
python实现人机五子棋
2020/03/25 Python
python连接mysql有哪些方法
2020/06/24 Python
OpenCV Python实现图像指定区域裁剪
2021/03/12 Python
Python编写单元测试代码实例
2020/09/10 Python
Python 的 f-string 可以连接字符串与数字的原因解析
2021/02/20 Python
纯CSS3实现绘制各种图形实现代码详细整理
2012/12/26 HTML / CSS
GetYourGuide台湾:预订旅游活动、景点和旅游项目
2019/06/10 全球购物
Laravel的加密解密与哈希实例讲解
2021/03/24 PHP
银行门卫岗位职责
2013/12/29 职场文书
顶岗实习计划书
2014/01/10 职场文书
开学典礼决心书
2014/03/11 职场文书
精彩广告词大全
2014/03/19 职场文书
热门专业求职信
2014/05/24 职场文书
校园环保标语
2014/06/13 职场文书
党的群众路线教育实践活动学习计划
2014/11/03 职场文书
2015年五四青年节活动总结
2015/02/10 职场文书
节约用电倡议书
2015/04/28 职场文书
幼儿园开学温馨提示
2015/07/15 职场文书
物资采购管理制度
2015/08/06 职场文书
Vue3实现简易音乐播放器组件
2022/08/14 Vue.js