php自动加载方式集合


Posted in PHP onApril 04, 2016

php加载文件方式:
1、include,include_once,requice,requice_one常规加载
2、__autoload()
3、spl_autoload_register()

常规加载方式
假设我们有一个类文件A.php,里面定义了一个名字为A的类:

<?php  
class A {  
  public function __construct() {  
    echo 'Got it.';  
  }  
}

然后我们有一个index.php需要用到这个类A,常规的写法就是

<?php  
  require('A.php');  
  $a = new A();

但是有一个问题就是,假如我们的index.php需要包含的不只是类A,而是需要很多类,这样子就必须写很多行require语句,有时候也会让人觉得不爽。

__autoload()自动加载
不过在php5之后的版本,我们就不再需要这样做了。
在php5中,试图使用尚未定义的类时会自动调用__autoload函数,所以我们可以通过编写__autoload函数来让php自动加载类,而不必写一个长长的包含文件列表。

例如在上面那个例子中,index.php可以这样写:

<?php  
function __autoload($class){  
  $file = $class . '.php';  
  if (is_file($file)) {  
    require_once($file);  
  }  
}  
$a = new A();

当然上面只是最简单的示范,__autoload只是去include_path寻找类文件并加载,我们可以根据自己的需要定义__autoload加载类的规则。注意:由于__autoload()是个函数,只能存在一次。

spl_autoload_register()自动加载
但现在问题来了,如果在一个系统的实现中,如果需要使用很多其它的类库,这些类库可能是由不同的开发人员编写的,其类名与实际的磁盘文件的映射规则不尽相同。这时如果要实现类库文件的自动加载,就必须在__autoload()函数中将所有的映射规则全部实现,这样的话__autoload()函数有可能 会非常复杂,甚至无法实现。最后可能会导致__autoload()函数十分臃肿,这时即便能够实现,也会给将来的维护和系统效率带来很大的负面影响。在这种情况下,难道就没有更简单清晰的解决办法了吧?答案当然是:NO!

spl_autoload_register() 满足了此类需求。 它实际上创建了 autoload 函数的队列,按定义时的顺序逐个执行。相比之下, __autoload() 只可以定义一次。

bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )
我们继续改写上面那个例子:

<?php  
function loader($class){  
  $file = $class . '.php';  
  if (is_file($file)) {  
    require_once($file);  
  }  
}  
spl_autoload_register('loader');  
$a = new A();

或者直接使用匿名函数:

<?php  
 
spl_autoload_register(function($file){
  $file = $class . '.php';  
  if (is_file($file)) {  
    require_once($file);  
  }
});  
$a = new A();

这样子也是可以正常运行的,这时候php在寻找类的时候就没有调用__autoload而是调用我们自己定义的函数loader了。同样的道理,下面这种写法也是可以的:

<?php  
class Loader {  
  public static function loadClass($class){  
    $file = $class . '.php';  
    if (is_file($file)) {  
      require_once($file);  
    }  
  }  
}  
spl_autoload_register(array('Loader', 'loadClass')); 
//spl_autoload_register(array(__CLASS__, 'loadClass')); 
//spl_autoload_register(array($this, 'loadClass')); 
$a = new A();

更多示例
autoload.php

<?php

define('SDK_PATH', __DIR__);

require_once SDK_PATH . '/common/functions.php';
require_once SDK_PATH . '/common/config.php';

spl_autoload_register(function ($class) {
  if (false !== stripos($class, 'YJC\Wechat')) {
    require_once __DIR__ . '/' . str_replace('\\', DIRECTORY_SEPARATOR, substr($class, 10)) . '.php';
  }
});


/*
function __autoload($class){
  if (false !== stripos($class, 'YJC\Wechat')) {
    require_once __DIR__ . '/' . str_replace('\\', DIRECTORY_SEPARATOR, substr($class, 10)) . '.php';
  }
}
*/

建议入口文件里养成定义绝对地址SDK_PATH的习惯,这样require不会出错。
以上就是本文的全部内容,希望对大家的学习有所帮助。

PHP 相关文章推荐
Windows下PHP的任意文件执行漏洞
Oct 09 PHP
一个简单计数器的源代码
Oct 09 PHP
一个简单的PHP&amp;MYSQL留言板源码
Jul 19 PHP
php while循环得到循环次数
Oct 26 PHP
codeigniter数据库操作函数汇总
Jun 12 PHP
一个完整的php文件上传类实例讲解
Oct 27 PHP
简单谈谈php延迟静态绑定
Jan 26 PHP
php处理复杂xml数据示例
Jul 11 PHP
php根据年月获取当月天数及日期数组的方法
Nov 30 PHP
php读取本地json文件的实例
Mar 07 PHP
php转换上传word文件为PDF的方法【基于COM组件】
Jun 10 PHP
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
Feb 11 PHP
php文件上传的两种实现方法
Apr 04 #PHP
在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的运行环境
Apr 04 #PHP
PHP版本的选择5.2.17 5.3.27 5.3.28 5.4 5.5兼容性问题分析
Apr 04 #PHP
PHP命名空间和自动加载类
Apr 03 #PHP
PHP中的Trait 特性及作用
Apr 03 #PHP
PHP错误处理函数
Apr 03 #PHP
php通过curl添加cookie伪造登陆抓取数据的方法
Apr 02 #PHP
You might like
PHP数组无限分级数据的层级化处理代码
2012/12/29 PHP
浅析PHP中strlen和mb_strlen的区别
2014/08/31 PHP
[原创]php逐行读取txt文件写入数组的方法
2015/07/02 PHP
详解PHP实现执行定时任务
2015/12/21 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
Mac系统下搭建Nginx+php-fpm实例讲解
2020/12/15 PHP
Extjs学习笔记之九 数据模型(上)
2010/01/11 Javascript
json数据的列循环示例
2013/09/06 Javascript
JavaScript拆分字符串时产生空字符的解决方案
2014/09/26 Javascript
node.js实现BigPipe详解
2014/12/05 Javascript
浅谈javascript属性onresize
2015/04/20 Javascript
jquery动态创建div与input的实例代码
2016/10/12 Javascript
使用Bootstrap美化按钮实例代码(demo)
2017/02/03 Javascript
Three.js利用性能插件stats实现性能监听的方法
2017/09/25 Javascript
浅谈Angular 中何时取消订阅
2017/11/22 Javascript
深入理解Promise.all
2018/08/08 Javascript
微信小程序实现搜索历史功能
2020/03/26 Javascript
利用原生JS实现data方法示例代码
2019/05/28 Javascript
Node.js从字符串生成文件流的实现方法
2019/08/18 Javascript
jQuery实现鼠标放置名字上显示详细内容气泡提示框效果的方法分析
2020/04/04 jQuery
JavaScript自定义超时API代码实例
2020/04/30 Javascript
深入理解javascript中的this
2021/02/08 Javascript
[00:33]2016完美“圣”典风云人物:Sccc宣传片
2016/12/03 DOTA
python实现目录树生成示例
2014/03/28 Python
python celery分布式任务队列的使用详解
2019/07/08 Python
python Autopep8实现按PEP8风格自动排版Python代码
2021/03/02 Python
css3圆角样式分享自定义按钮样式
2013/12/27 HTML / CSS
意大利时尚奢侈品店:D’Aniello Boutique
2021/01/19 全球购物
怎么处理XML的中文问题
2015/03/26 面试题
JPA的优势都有哪些
2013/07/04 面试题
工商管理毕业生推荐信
2013/12/24 职场文书
教师个人的自我评价分享
2014/01/02 职场文书
植树节标语
2014/06/27 职场文书
公司年会开场白
2015/06/01 职场文书
pytorch通过训练结果的复现设置随机种子
2021/06/01 Python
Python编程super应用场景及示例解析
2021/10/05 Python