zoukankan      html  css  js  c++  java
  • PHP中__autoload()与spl_autoload_register()函数的用法与区别

    _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函数。

  • 相关阅读:
    控制翻转与容器
    构造函数传递参数
    bean属性检查
    tomcat源码阅读14
    Block Formatting Context
    IE 兼容性问题的处理
    JavaScript 的原型与继承
    IE 多版本测试工具 IETester
    callee,caller,call,apply
    HDOJ2175 汉诺塔IX
  • 原文地址:https://www.cnblogs.com/ldphoebe/p/6077137.html
Copyright © 2011-2022 走看看