详解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写的serv-u的web申请账号的程序
Oct 09 PHP
截获网站title标签之家内容的例子
Oct 09 PHP
PHP和XSS跨站攻击的防范
Apr 17 PHP
php数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
Oct 31 PHP
php用正则表达式匹配中文实例详解
Nov 06 PHP
php中使用PHPExcel读写excel(xls)文件的方法
Sep 15 PHP
php数字每三位加逗号的功能函数
Oct 22 PHP
php 实现一个字符串加密解密的函数实例代码
Nov 01 PHP
php实现基于pdo的事务处理方法示例
Jul 21 PHP
php正确输出json数据的实例讲解
Aug 21 PHP
php使用yield对性能提升的测试实例分析
Sep 19 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
Feb 27 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 spl_autoload_register实现自动加载研究
2011/12/06 PHP
深入eAccelerator与memcached的区别详解
2013/06/06 PHP
php实现中文转数字
2016/02/18 PHP
PHP实现统计在线人数功能示例
2016/10/15 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
Laravel5.3+框架定义API路径取消CSRF保护方法详解
2020/04/06 PHP
IE8中使用javascript动态加载CSS的解决方法
2014/06/17 Javascript
Internet Explorer 11 浏览器介绍:别叫我IE
2014/09/28 Javascript
node.js中Socket.IO的进阶使用技巧
2014/11/04 Javascript
实例代码详解javascript实现窗口抖动及qq窗口抖动
2016/01/04 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
2016/07/13 Javascript
实例解析angularjs的filter过滤器
2016/12/14 Javascript
简单实现js倒计时功能
2017/02/13 Javascript
使用gulp搭建本地服务器并实现模拟ajax
2017/04/05 Javascript
angular4自定义组件非input元素实现ngModel双向数据绑定的方法
2018/12/28 Javascript
新年快乐! javascript实现超级炫酷的3D烟花特效
2019/01/30 Javascript
Vue函数式组件-你值得拥有
2019/05/09 Javascript
Vue监听滚动实现锚点定位(双向)示例
2019/11/13 Javascript
python在不同层级目录import模块的方法
2016/01/31 Python
Python使用email模块对邮件进行编码和解码的实例教程
2016/07/01 Python
django 解决manage.py migrate无效的问题
2018/05/27 Python
使用PM2+nginx部署python项目的方法示例
2018/11/07 Python
python的pytest框架之命令行参数详解(上)
2019/06/27 Python
Python大数据之从网页上爬取数据的方法详解
2019/11/16 Python
Python基于Tkinter编写crc校验工具
2020/05/06 Python
Python logging日志库空间不足问题解决
2020/09/14 Python
HTML5中的Web Notification桌面右下角通知功能的实现
2018/04/19 HTML / CSS
Net Remoting把服务器端激活两种模式
2014/01/22 面试题
final, finally, finalize的区别
2012/03/01 面试题
园林技术个人的自我评价
2014/02/15 职场文书
中国梦读书活动总结
2014/07/10 职场文书
2014年小班保育员工作总结
2014/12/23 职场文书
保研推荐信范文
2015/03/25 职场文书
捐书仪式主持词
2015/07/04 职场文书
创业计划书之川味火锅店
2019/09/02 职场文书
eclipse创建项目没有dynamic web的解决方法
2021/06/24 Java/Android