PHP中的自动加载操作实现方法详解(2)

new N个class,比如:

<?php
function __autoload($className)
{
  require $className .'.php';
}
$db =new DB();
$info =newInfo();
$gender =newGender();
$name =newName();
//也是支持静态方法直接调用的
Height::test();

2. spl_autoload_register的使用

小的项目,用__autoload()就能实现基本的自动加载了。但是如果一个项目过大,或者需要不同的自动加载来加载不同路径的文件,这个时候__autoload就悲剧了,原因是一个项目中仅能有一个这样的 __autoload() 函数,因为 PHP 不允许函数重名,也就是说你不能声明2个__autoload()函数文件,否则会报致命错误,我了个大擦,那怎么办呢?放心,你想到的,PHP开发大神早已经想到。

所以spl_autoload_register()这样又一个牛逼函数诞生了,并且取而代之它。它执行效率更高,更灵活

先看下它如何使用吧:

当我们去new一个找不到的class时,PHP就会去自动调用sql_autoload_resister注册的函数,这个函数通过它的参数传进去:

sql_autoload_resister($param) 这个参数可以有多种形式:
sql_autoload_resister('load_function'); //函数名
sql_autoload_resister(array('load_object', 'load_function')); //类和静态方法
sql_autoload_resister('load_object::load_function'); //类和方法的静态调用
//php 5.3之后,也可以像这样支持匿名函数了。
spl_autoload_register(function($className){
  if (is_file('./lib/' . $className . '.php')) {
    require './lib/' . $className . '.php';
  }
});

index.php

function load1($className)
{
  echo 1;
  require $className .'.php';
}
spl_autoload_register('load1');//将load1函数注册到自动加载队列中。
$db =new DB();//找不到DB类,就会自动去调用刚注册的load1函数了

上面就是实现了自动加载的方式,我们同样也可以用类加载的方式调用,但是必须是static方法:

class autoloading {
//必须是静态方法,不然报错
  public static function load($className)
  {
    require $className .'.php';
  }
}
//2种方法都可以
spl_autoload_register(array('autoloading','load'));
spl_autoload_register('autoloading::load');
$db =new DB();//会自动找到

需要注意的是,如果你同时使用spl_autoload_register__autoload__autoload会失效!!! 再说了,本来就是替换它的,就一心使用spl_autoload_register就好了。

3. 多个spl_autoload_register的使用

spl_autoload_register

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/5246.html