_autoload() 函数在PHP文档中的解释是试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。

如何理解这句话,我们首先看下面一个简单的例子:

首先定义ClassA和ClassB两个类,其中ClassB继承ClassA。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
 //定义一个类ClassA,文件名为ClassA.php
class ClassA{
 public  function __construct(){
  echo "ClassA load success!";
 }
}
 //定义一个类ClassB,文件名为ClassB.php,ClassB继承ClassA
class ClassB extends ClassA {
 public function __construct(){
  //parent::__construct();
  echo "ClassB load success!";
 }
}
?>

下面我们使用__autoload()加载这两个类:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
 function __autoload($classname){
 $classpath="./".$classname.'.php';
 if(file_exists($classpath)){
  require_once($classpath);
 }
 else{
  echo 'class file'.$classpath.'not found!';
 }
}
$newobj new ClassA();
$newobj new ClassB();
?>

上面代码输出:

ClassA load success!

ClassB load success!

说明当我们实例化一个类是自动调用__autoload()函数

用这种方法加载类是不是很简单呢,但是这里需要注意以下几点:

1、如果类存在继承关系,那么继承者和被继承者要在同一个目录下。

2、使用__autoload函数时,类名和类的文件名必须一致。

3、在CLI模式下运行PHP脚本的话这个方法无效

当我们开发大型应用程序时,会有很多类需要加载,此时如果再使用__autoload()函数来加载的话程序就会显得很臃肿。大家在阅读PHP手册关于__autoload()函数时可能会注意到有这样一句话:spl_autoload_register() 提供了一种更加灵活的方式来实现类的自动加载。因此,不再建议使用 __autoload() 函数,在以后的版本中它可能被弃用。下面我们看看spl_autoload_register()有哪些优势。

官方手册对spl_autoload_register()函数是这样解释的: 注册__autoload()函数。

这样很难理解,下面我们看一个实例:

1
2
3
4
5
6
7
8
9
10
11
<?php
function loadprint( $class ) {
 $file = $class '.class.php';
 if (is_file($file)) {
  require_once($file);
 }
}
spl_autoload_register( 'loadprint' );
$obj = new PRINTIT();
$obj->doPrint();
?>

在代码中我们将__autoload替换成loadprint,此时loadprint()函数不会自动调用,这时spl_autoload_register()就起作用了,它告诉PHP碰到没有定义的类就执行loadprint()。

因此,当我们不想自动加载的时候调用__autoload,而是调用我们自己的函数(或者类方法),我们可以使用spl_autoload_register来注册我们自己的autoload函数。

最新文章

  1. Spark SQL 之 DataFrame
  2. 关于SQL安装问题及安装前的准备
  3. 将文件路径以&quot;\&quot;隔开
  4. elixir 高可用系列 - 目录
  5. openwrt的路由器重置root密码
  6. [fedora21]给fedora21安装fcitx输入法
  7. CODESOFT对话框中的显示字体怎么修改
  8. 安装JDK后环境变量的配置
  9. Intellij IDEA14 下添加ExtJS提示支持
  10. POJ 1852
  11. malloc函数的底层实现你是否清楚
  12. C#Combobox显示名称保存代码
  13. 单线多拨,傻瓜式openwrt单线多拨叠加速率教程
  14. AlertDialog详解
  15. Undefined symbols for architecture i386: &quot;_crc32&quot;, referenced from:——crc链接错误
  16. poj1410计算几何线段相交
  17. 一起学微软Power BI系列-使用技巧(6) 连接Sqlite数据库
  18. 非web环境的注解配置的spring项目应用(non-web, Spring-data-jpa, JavaConfig, Java Application, Maven, AnnotationConfigApplicationContext)
  19. Pre-shared key
  20. Flask之before_request、after_request

热门文章

  1. mobiscroll的例子
  2. gradle下的第一个SpringMVC应用
  3. postgresql----索引失效
  4. Oracle数据类型clob和blob
  5. Python爬虫基础(一)urllib2库的基本使用
  6. mysql-blog
  7. 个人理解---KMP与Next数组详解
  8. Flask wtform组件
  9. Logback配置讲解
  10. PhotoSwipe中文API(四)