详解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&amp;mysql(四)
Oct 09 PHP
PHP编程中字符串处理的5个技巧小结
Nov 13 PHP
坏狼php学习 计数器实例代码
Jun 15 PHP
php中计算时间差的几种方法
Dec 31 PHP
PHP PDO函数库详解
Apr 27 PHP
兼容firefox,chrome的网页灰度效果
Aug 08 PHP
PHP函数spl_autoload_register()用法和__autoload()介绍
Feb 04 PHP
php中simplexml_load_file函数用法实例
Nov 12 PHP
thinkphp中session和cookie无效的解决方法
Dec 19 PHP
PHP 魔术变量和魔术函数详解
Feb 25 PHP
YII Framework框架教程之国际化实现方法
Mar 14 PHP
Laravel框架自定义验证过程实例分析
Feb 01 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 5.0创建图形的巧妙方法
2010/10/12 PHP
分享一段PHP制作的中文拼音首字母工具类
2014/12/11 PHP
php使用gettimeofday函数返回当前时间并存放在关联数组里
2015/03/19 PHP
PHP实现CSV文件的导入和导出类
2015/03/24 PHP
PHP常用工具类大全附全部代码下载
2015/12/07 PHP
PHP使用file_get_contents发送http请求功能简单示例
2018/04/29 PHP
js CSS操作方法集合
2008/10/31 Javascript
javascript 命名规则 变量命名规则
2010/02/25 Javascript
JS特殊函数(Function()构造函数、函数直接量)区别介绍
2013/05/19 Javascript
Jquery 的outerHeight方法使用介绍
2013/09/11 Javascript
可插入图片的TEXT文本框
2013/12/27 Javascript
js获取窗口相对于屏幕左边和上边的位置坐标
2014/05/15 Javascript
js实现同一页面可多次调用的图片幻灯切换效果
2015/02/28 Javascript
jQuery Dialog对话框事件用法实例分析
2016/05/10 Javascript
设计模式中的facade外观模式在JavaScript开发中的运用
2016/05/18 Javascript
js重写方法的简单实现
2016/07/10 Javascript
微信小程序 获取微信OpenId详解及实例代码
2016/10/31 Javascript
jquery获取链接地址和跳转详解(推荐)
2017/08/15 jQuery
JS使用JSON.parse(),JSON.stringify()实现对对象的深拷贝功能分析
2019/03/06 Javascript
layUI的验证码功能及校验实例
2019/10/25 Javascript
antd多选下拉框一行展示的实现方式
2020/10/31 Javascript
[03:27]最受玩家喜爱奖提名:PZH_Element 致玩家寄语
2016/12/20 DOTA
python dict remove数组删除(del,pop)
2013/03/24 Python
深入讲解Python编程中的字符串
2015/10/14 Python
numpy数组拼接简单示例
2017/12/15 Python
详解Django之auth模块(用户认证)
2018/04/17 Python
python lxml中etree的简单应用
2019/05/10 Python
如何用Python做一个微信机器人自动拉群
2019/07/03 Python
HTML5 离线应用之打造零请求、无流量网站的解决方法
2013/04/25 HTML / CSS
银行财务部实习生的自我鉴定
2013/11/27 职场文书
创业者是否需要商业计划书?
2014/02/07 职场文书
开学典礼主持词
2014/03/19 职场文书
员工生日会策划方案
2014/06/14 职场文书
企业群众路线教育实践活动心得体会
2014/11/03 职场文书
消防宣传标语大全
2015/08/03 职场文书
详解Nginx 被动检查服务器的存活状态
2021/10/16 Servers