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