详解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 相关文章推荐
用Zend Encode编写开发PHP程序
Feb 21 PHP
利用PHP实现短域名互转
Jul 05 PHP
php中session使用示例
Mar 29 PHP
PHP实现单例模式最安全的做法
Jun 13 PHP
PHP中使用hidef扩展代替define提高性能
Apr 09 PHP
php实现图片上传并利用ImageMagick生成缩略图
Mar 14 PHP
yii2.0整合阿里云oss上传单个文件的示例
Sep 19 PHP
php实现微信公众平台发红包功能
Jun 14 PHP
PHP中常见的密码处理方式和建议总结
Oct 14 PHP
PHP中soap用法示例【SoapServer服务端与SoapClient客户端编写】
Dec 25 PHP
PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例
May 30 PHP
php7 list()、session及其他模块的修改实例分析
May 25 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生成静态HTML文档的原理
2012/10/29 PHP
php实现搜索一维数组元素并删除二维数组对应元素的方法
2015/07/06 PHP
PHP中overload与override的区别
2017/02/13 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
PHP验证类的封装与使用方法详解
2019/01/10 PHP
基于JS实现简单的样式切换效果代码
2015/09/04 Javascript
全面详细的jQuery常见开发技巧手册
2016/02/21 Javascript
jQuery实现的事件绑定功能基本示例
2017/10/11 jQuery
React Native中Navigator的使用方法示例
2017/10/13 Javascript
在Vue项目中,防止页面被缩放和放大示例
2019/10/28 Javascript
Javascript地址引用代码实例解析
2020/02/25 Javascript
python应用程序在windows下不出现cmd窗口的办法
2014/05/29 Python
python获取外网IP并发邮件的实现方法
2017/10/01 Python
python实现画圆功能
2018/01/25 Python
Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法
2018/03/13 Python
python之DataFrame实现excel合并单元格
2021/02/22 Python
python 矩阵增加一行或一列的实例
2018/04/04 Python
Python实现将Excel转换成xml的方法示例
2018/08/25 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
2019/06/05 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
2019/10/28 Python
Python中logger日志模块详解
2020/08/04 Python
python实现图片素描效果
2020/09/26 Python
Django配置Bootstrap, js实现过程详解
2020/10/13 Python
美国摄影爱好者购物网站:Focus Camera
2016/10/21 全球购物
某IT外企面试题-二分法求方程!看看大家的C++功底
2015/07/04 面试题
环境科学毕业生自荐信
2013/11/21 职场文书
升职自荐书范文
2013/11/28 职场文书
带薪年假请假条
2014/02/04 职场文书
共筑中国梦演讲稿
2014/04/23 职场文书
竞聘演讲稿精彩开头和结尾
2014/05/14 职场文书
商场租赁意向书
2014/07/30 职场文书
法人代表证明书
2014/09/18 职场文书
华山导游词
2015/02/03 职场文书
营业员岗位职责
2015/02/11 职场文书
工会工作个人总结
2015/03/03 职场文书
教师个人工作总结范文2015
2015/10/14 职场文书