autoload在php主版本中是自动加载文件的一个方法了我们可以定义许多的文件在目录然后通过autoload加载了,下面来看看autoload函数用法。

在PHP5之后,我们可以通过 __autoload来解决这个问题。 而且在PHP5.1之后,还提供了 spl_autoload_register() 来提供更完善的加载机制。

通过阅读了 Autoloading in PHP 这篇文章,我理解的 Autoload 的加载机制,当通过 new 来实例化一个类时,PHP会通过定义的__autoload 函数加载相应的文件,如果这个类文件使用了 extends 或者 implements 需要用到其他的类文件,php会重新运行 autoload 去进行类文件的查找和加载,如果发生了两次对同一类文件的请求,就会报错

自动加载原理

在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进行复用,同时将来维护时也很便利。这也是OO设计的基本思想之一。在PHP5之前,如果需要使用一个类,只需要直接使用include/require将其包含进来即可。下面是一个实际的例子:

/* Person.class.php */

class Person {

var $name, $age;

function __construct ($name, $age)

{

$this->name = $name;

$this->age = $age;

}

}

?>

/* no_autoload.php */

require_once (”Person.class.php”);

$person = new Person(”Altair”, 6);

var_dump ($person);

?>

在这个例子中,no-autoload.php文件需要使用Person类,它使用了require_once将其包含,然后就可以直接使用Person类来实例化一个对象。

但随着项目规模的不断扩大,使用这种方式会带来一些隐含的问题:如果一个PHP文件需要使用很多其它类,那么就需要很多的require/include语句,这样有可能会造成遗漏或者包含进不必要的类文件。如果大量的文件都需要使用其它的类,那么要保证每个文件都包含正确的类文件肯定是一个噩梦。

PHP5为这个问题提供了一个解决方案,这就是类的自动装载(autoload)机制。autoload机制可以使得PHP程序有可能在使用类时才自动包含类文件,而不是一开始就将所有的类文件include进来,这种机制也称为lazy loading。

下面是使用autoload机制加载Person类的例子:

/* autoload.php */

function __autoload($classname) {

require_once ($classname . “class.php”);

}

$person = new Person(”Altair”, 6);

var_dump ($person);

?>

通常PHP5在使用一个类时,如果发现这个类没有加载,就会自动运行__autoload()函数,在这个函数中我们可以加载需要使用的类。在我们这个简单的例子中,我们直接将类名加上扩展名”.class.php”构成了类文件名,然后使用require_once将其加载。从这个例子中,我们可以看出autoload至少要做三件事情,第一件事是根据类名确定类文件名,第二件事是确定类文件所在的磁盘路径(在我们的例子是最简单的情况,类与调用它们的PHP程序文件在同一个文件夹下),第三件事是将类从磁盘文件中加载到系统中。第三步最简单,只需要使用include/require即可。要实现第一步,第二步的功能,必须在开发时约定类名与磁盘文件的映射方法,只有这样我们才能根据类名找到它对应的磁盘文件。

因此,当有大量的类文件要包含的时候,我们只要确定相应的规则,然后在__autoload()函数中,将类名与实际的磁盘文件对应起来,就可以实现lazy loading的效果。从这里我们也可以看出__autoload()函数的实现中最重要的是类名与实际的磁盘文件映射规则的实现。

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

(2) PHP的autoload机制的实现

实现自动加载,我们需要借助一个函数来实现:

/*

autoload_function

欲注册的自动装载函数。如果没有提供任何参数,则自动注册 autoload 的默认实现函数spl_autoload()。

throw

此参数设置了 autoload_function 无法成功注册时, spl_autoload_register()是否抛出异常。

prepend

如果是 true,spl_autoload_register() 会添加函数到队列之首,而不是队列尾部。

*/

bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )

最常用的一种方式就是通过spl_autoload_register函数来注册自动加载类的方法!

通过spl_autoload_register注册

我们可以通过spl_autoload_register函数注册类的方法,在类调用前,我们判断类文件路径是否是文件,如果是则引入之!

下面是一个小例子:

class autoload

{

publicstatic functionload($className)

{

$name = str_replace('\\', '/', $className);

$fileName = sprintf('%s.php', $name);

if (is_file($fileName)) {

require_once $fileName;

}

// var_dump($fileName);

}

}

// 这样写也可以的

// spl_autoload_register(array("autoload", "load"));

spl_autoload_register("autoload::load");

通过__autoload函数实现

我们新建一个autoload.php文件,里面只放如下代码也可以实现上面一样的功能:

function__autoload($className) {

$name = str_replace('\\', '/', $className);

$fileName = sprintf('%s.php', $name);

if (is_file($fileName)) {

require_once($fileName);

}

}

小结

自动加载可以使得我们的操作更简便,经常需要自动加载一些默认配置,因此掌握自动加载的实现是非常重要的!

php autoload用法,php自动加载__autoload()函数用法相关推荐

  1. PHP自动加载__autoload的工作机制

    PHP自动加载__autoload的工作机制 PHP的懒加载lazy loading 在 2011年11月12日 那天写的     已经有 4559 次阅读了 感谢 参考或原文 服务器君一共花费了11 ...

  2. 有关 php __autoload 自动加载类函数的用法

    这个函数是一个自动加载类函数,啥事自动加载函数,顾名思义 ,那就是自己就会加载类的函数(原谅我废话了) 我们先看下面的代码: <?php function __autoload($classna ...

  3. PHP的自动加载__autoload spl_autoload_register

    https://www.jb51.net/article/134372.htm 问题 传统上,在PHP里,当我们要用到一个class文件的时候,我们都得在文档头部require或者include一下: ...

  4. php入门篇-------PHPCMS 入口文件,自动加载系统函数和URL规则

    这里主要分析PHPCMS的入口文件和系统自动加载配置文件和系统函数,还有URL的规则: 首先是入口文件分析: index.php 2,框架主文件分析:(这里主要分析加载配置文件和公共函数,还有URL规 ...

  5. ThinkPHP 3.2.3 自动加载公共函数文件的方法

    方法一.加载默认的公共函数文件 在 ThinkPHP 3.2.3 中,默认的公共函数文件位于公共模块 ./Application/Common 下,访问所有的模块之前都会首先加载公共模块下面的配置文件 ...

  6. JS 网页自动加载js函数

    1法:body 的onload的方法 <body onLoad="clockon(bgclock)"> 2法:window.onload方法 <script de ...

  7. python类加载机制_PHP面向对象自动加载机制原理与用法分析

    本文实例讲述了PHP面向对象自动加载机制原理与用法.分享给大家供大家参考,具体如下: 在学习PHP的面向对象的时候,会知道很多"语法糖",也就是魔术方法.有一个加自动加载的魔术方法 ...

  8. php的_autoload函数实现自动加载类的使用

    本文章详细的以实例来介绍了关于php _autoload自动加载类的用法以及如何使用_autoload来减少程序上的include和require的调用哦. 在使用PHP的OO模式开发系统时,通常大家 ...

  9. thinkphp 框架自动加载原理_这下你应该理解ThinkPHP的Loader自动加载了

    想了很久终于要开始系列文章的编写了,期望是写出提升和面试都可以搞定的系列文章. 当你看到本文时,如果你发现咔咔没有编写到的面试热点问题或者技术难点,期待评论区指出,一起完善. 前言 目前再整理PHP进 ...

最新文章

  1. WSAGetLastError返回的可能错误代码
  2. 用流读取文件中的内容
  3. 【测试】视频流媒体服务器研究1
  4. 提权 调试权限 OpenProcess 拒绝访问的解决办法
  5. 病毒式营销案例:多芬让“病毒”的诱惑自发传递
  6. 计算机仿真实训系统的企业排名,闵行区虚拟仿真实训平台企业-哪家不错
  7. 中科大博士写外挂被抓,非法牟利300多万!
  8. Php jsondb,JsonDB-PHP
  9. windows下nc(netcat)的安装及使用
  10. 没得玩了!腾讯这款游戏宣布将于12月15日停服
  11. python类中变量作用域_python进阶14变量作用域LEGB
  12. NSCharacterSet 简单用法
  13. 在Debian 6 安装pptpd ×××。
  14. TDD(测试驱动开发)工作流程:
  15. C++实现16进制和字符串的转换
  16. 用MyDiskTest检测存储卡真实容量(图)
  17. C语言习题:编程序将”China”译成密码[C语言]
  18. 【学习记录】Tpro遥控器_暂时取消Tpro的控制权(简易)
  19. android手机设置固定dns,手机dns怎么设置 简单几步就搞定
  20. 北京外国语大学本科毕业论文答辩和论文选题PPT模板

热门文章

  1. php numeric乘法,PHP is_numeric()用法及代码示例
  2. Matlab库中过采样函数rcosflt参数及源代码详解(翻译)
  3. 模拟调频信号FM解调的matlab和C语言实现
  4. Windows编程初步(三)【说明:有敏感字眼已全删,不知道为啥还审核不通过】
  5. OD汇编指令集(不断更新)
  6. linux时间路径,关于linux中的时间 时区问题
  7. leetcode-54 螺旋矩阵
  8. 面向对象进阶-反射(二)重要知识点
  9. 嵌入式基础篇 - 第2章 Systick系统定时器
  10. 闰秒对数据库和linux的影响