page contents

php自动加载

PHP实现自动加载,有两种方法:魔术函数 __autoload()。spl扩展 spl_autoload_register

attachments-2020-05-Bj7Robc75eb100479cff1.jpg

PHP实现自动加载,有两种方法:

①魔术函数 __autoload()

②spl扩展 spl_autoload_register


分别举例说明:

一、__autoload

  printit.class.php:

1 <?php
2 class PRINTIT {
3  function doPrint() {
4  echo 'hello world';
5  }
6 }

 index.php:

<?php
function __autoload( $class ) {
     $file = $class . '.class.php';
     if ( is_file($file) ) {
     require_once($file);
     }
}
$obj = new PRINTIT();
$obj->doPrint();

当我们每次运行index.php后都会正常输出hello world,尽管我们并没有在index.php中引入printit.class.php文件,但是我们依然能够用PRINTIT类内的方法。

在index.php中,由于没有包含printit.class.php,在实例化printit时,自动调用__autoload函数,参数$class的值即为类名printit,此时printit.class.php就被引进来了。

在面向对象中这种方法经常使用,可以避免书写过多的引用文件,同时也使整个系统更加灵活。


二、spl_autoload_register()

<?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不会像__autoload自动触发,这时spl_autoload_register()就起作用了,它告诉PHP碰到没有定义的类就执行loadprint()。

spl_autoload_register() 调用静态方法。

<?php
class test {
     public static function loadprint( $class ) {
     $file = $class . '.class.php';
         if (is_file($file)) {
              require_once($file);
         }
     }
}
spl_autoload_register( array('test','loadprint') );
//另一种写法:spl_autoload_register( "test::loadprint" );
$obj = new PRINTIT();
$obj->doPrint();
 

注:SPL是Standard PHP Library(标准PHP库)的缩写。

它是PHP5引入的一个扩展库,其主要功能包括autoload机制的实现及包括各种Iterator接口或类。

SPL autoload机制的实现是通过将函数指针autoload_func指向自己实现的具有自动装载功能的函数来实现的。

SPL有两个不同的函数spl_autoload, spl_autoload_call,通过将autoload_func指向这两个不同的函数地址来实现不同的自动加载机制。

classLoad
{
     function static  loadClass($class_name){
            $filename= $class_name.".class.php";
            $path= "include/".$filename
            if(is_file($path)) returninclude$path;
      }
}
/**
 * 设置对象的自动载入
 * spl_autoload_register — Register given function as __autoload() implementation
 */
spl_autoload_register(array('LOAD', 'loadClass'));
/**
*__autoload 方法在 spl_autoload_register 后会失效,因为 autoload_func 函数指针已指向 spl_autoload 方法
* 可以通过下面的方法来把 _autoload 方法加入 autoload_functions list
*/
spl_autoload_register( '__autoload');

如果同时用spl_autoload_register注册了一个类的方法和__autoload函数,那么,会根据注册的先后,如果在第一个注册的方法或函数里加载了类文件,就不会再执行第二个被注册的类的方法或函数。

反之就会执行第二个被注册的类的方法或函数。

<?php
class autoloader {
  public static $loader;
  public static function init() {
    if (self::$loader == NULL)
      self::$loader = new self ();
    return self::$loader;
  }
  public function __construct() {
    spl_autoload_register ( array ($this, 'model' ) );
    spl_autoload_register ( array ($this, 'helper' ) );
    spl_autoload_register ( array ($this, 'controller' ) );
    spl_autoload_register ( array ($this, 'library' ) );
  }
  public function library($class) {
    set_include_path ( get_include_path () . PATH_SEPARATOR . '/lib/' );
    spl_autoload_extensions ( '.library.php' );
    spl_autoload ( $class );
  }
  public function controller($class) {
    $class = preg_replace ( '/_controller$/ui', '', $class );
    set_include_path ( get_include_path () . PATH_SEPARATOR . '/controller/' );
    spl_autoload_extensions ( '.controller.php' );
    spl_autoload ( $class );
  }
  public function model($class) {
    $class = preg_replace ( '/_model$/ui', '', $class );
    set_include_path ( get_include_path () . PATH_SEPARATOR . '/model/' );
    spl_autoload_extensions ( '.model.php' );
    spl_autoload ( $class );
  }
  public function helper($class) {
    $class = preg_replace ( '/_helper$/ui', '', $class );
    set_include_path ( get_include_path () . PATH_SEPARATOR . '/helper/' );
    spl_autoload_extensions ( '.helper.php' );
    spl_autoload ( $class );
  }
}
//call
autoloader::init ();


attachments-2020-05-21h4HwR55eb1002e9404e.jpg

  • 发表于 2020-05-05 13:58
  • 阅读 ( 622 )
  • 分类:PHP开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1470 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章