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 相关文章推荐
第三节 定义一个类 [3]
Oct 09 PHP
BBS(php &amp; mysql)完整版(五)
Oct 09 PHP
php面向对象全攻略 (一) 面向对象基础知识
Sep 30 PHP
php连接mssql的一些相关经验及注意事项
Feb 05 PHP
PHP中的socket_read和socket_recv区别详解
Feb 09 PHP
PHP实现自动对图片进行滚动显示的方法
Mar 12 PHP
基于PHP实现的事件机制实例分析
Jun 18 PHP
PHP+Mysql+jQuery实现发布微博程序 php篇
Oct 15 PHP
Zend Studio使用技巧两则
Apr 01 PHP
php基于SQLite实现的分页功能示例
Jun 21 PHP
PHP魔术方法之__call与__callStatic使用方法
Jul 23 PHP
详解Laravel框架的依赖注入功能
May 27 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配置心得包含MYSQL5乱码解决
2006/11/20 PHP
php过滤危险html代码
2008/08/18 PHP
解析PHP获取当前网址及域名的实现代码
2013/06/23 PHP
php字符串截取的简单方法
2013/07/04 PHP
解决Codeigniter不能上传rar和zip压缩包问题
2014/03/07 PHP
PHP explode()函数的几个应用和implode()函数有什么区别
2015/11/05 PHP
PHP开发中AJAX技术的简单应用
2015/12/11 PHP
javascript中的void运算符语法及使用介绍
2013/03/10 Javascript
NodeJS制作爬虫全过程(续)
2014/12/22 NodeJs
JS往数组中添加项性能分析
2015/02/25 Javascript
解决AngualrJS页面刷新导致异常显示问题
2017/04/20 Javascript
浅谈Vue网络请求之interceptors实际应用
2018/02/28 Javascript
Vue父子组件双向绑定传值的实现方法
2018/07/31 Javascript
解决webpack+Vue引入iView找不到字体文件的问题
2018/09/28 Javascript
Vue 组件修改根实例的数据的方法
2019/04/02 Javascript
Layui选项卡制作历史浏览记录的方法
2019/09/28 Javascript
node.js使用 http-proxy 创建代理服务器操作示例
2020/02/10 Javascript
解决vuecli3中img src 的引入问题
2020/08/04 Javascript
Python实现抓取页面上链接的简单爬虫分享
2015/01/21 Python
详解python3中zipfile模块用法
2018/06/18 Python
python3读取excel文件只提取某些行某些列的值方法
2018/07/10 Python
解决TensorFlow训练内存不断增长,进程被杀死问题
2020/02/05 Python
python+flask编写一个简单的登录接口
2020/11/13 Python
使用CSS3制作一个简单的Chrome模拟器
2015/07/15 HTML / CSS
Charlotte Tilbury澳大利亚官网:英国美妆品牌
2018/10/05 全球购物
美国最大的电子宠物训练产品制造商:PetSafe
2018/10/12 全球购物
商得四方公司面试题(gid+)
2014/04/30 面试题
品质主管的岗位职责
2013/12/04 职场文书
员工安全生产承诺书
2014/05/22 职场文书
奶茶店创业计划书
2014/08/14 职场文书
暑期实践个人总结
2015/03/06 职场文书
2015年七年级班主任工作总结
2015/05/21 职场文书
详解CocosCreator项目结构机制
2021/04/14 Javascript
如何利用Python实现一个论文降重工具
2021/07/09 Python
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
2022/03/16 Redis
numpy array找出符合条件的数并赋值的示例代码
2022/06/01 Python