了解两个函数__autoload()和spl_autoload_register()
这两个函数的作用都是'自动加载',那么什么是自动加载呢?就是就是我们在
new一个class的时候,不需要手动去写require来导入这个class.php文件,
程序自动帮我们加载导入进来,这就是自动加载,那么这两个函数有什么区别呢
__autoload():因为php是不允许函数重名的所以说这个方法只能定义一次,
这就显得这个函数有点鸡助了,因此就有另一个函数的产生spl_autoload_register($className)
这个函数就可以弥补__autoload()的不足之处了,怎么说呢这个函数的确很强大
当我们去new一个找不到的class时,PHP就会去自动调用sql_autoload_resister注册的函数,
这个函数通过它的参数($className)传进去比如说:
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';
}
});
它会把参数自动填入到我们要找的路径中这样让我们轻松了很多,当然这个函数的参数
可以有多种形式的的!
我们还可以用类的加载方式但是要注意了必须是'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会失效
说了这么半天了那么主题也该说到了__autoload只能定义一次那么让我们看看spl_autoload_register
是怎样定义多次的
function load1($className)
{
echo 1;
if (is_file($className . '.php')) {
require $className . '.php';
}
}
function load2($className)
{
echo 2;
if (is_file('./app/' . $className . '.php')) {
require './app/' . $className . '.php';
}
}
function __autoload($className)
{
echo 3;
if (is_file('./lib/' . $className . '.php')) {
require './lib/' . $className . '.php';
}
}
//注册了3个
spl_autoload_register('load1');
spl_autoload_register('load2');
spl_autoload_register('__autoload');
$db = new DB(); //DB就在本目录下
$info = new Info(); //Info 在/lib/Info.php
我们注册了3个自动加载函数。执行结果是啥呢?
1Hello DB
123Hello Info
当然这个结果是怎么来的的让我们分析一下
new DB的时候,就按照注册顺序,先去找load1()函数了,发现找到了,就停止了,所以输出1 Hello
new Info的时候,先是安装注册顺序,先找load1(), 所以输出了1,发现没找到,就去load2()里面去找,所以输出了2,
还是没这个文件,就去__autoload()函数里找,所以,先输出了3,再输出Hello Info
注意:spl_autoload_register使用时,__autoload会无效,有时候,我们希望它继续有效,就可以也将它注册进来,就可以继续使用
这两个函数的作用都是'自动加载',那么什么是自动加载呢?就是就是我们在
new一个class的时候,不需要手动去写require来导入这个class.php文件,
程序自动帮我们加载导入进来,这就是自动加载,那么这两个函数有什么区别呢
__autoload():因为php是不允许函数重名的所以说这个方法只能定义一次,
这就显得这个函数有点鸡助了,因此就有另一个函数的产生spl_autoload_register($className)
这个函数就可以弥补__autoload()的不足之处了,怎么说呢这个函数的确很强大
当我们去new一个找不到的class时,PHP就会去自动调用sql_autoload_resister注册的函数,
这个函数通过它的参数($className)传进去比如说:
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';
}
});
它会把参数自动填入到我们要找的路径中这样让我们轻松了很多,当然这个函数的参数
可以有多种形式的的!
我们还可以用类的加载方式但是要注意了必须是'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会失效
说了这么半天了那么主题也该说到了__autoload只能定义一次那么让我们看看spl_autoload_register
是怎样定义多次的
function load1($className)
{
echo 1;
if (is_file($className . '.php')) {
require $className . '.php';
}
}
function load2($className)
{
echo 2;
if (is_file('./app/' . $className . '.php')) {
require './app/' . $className . '.php';
}
}
function __autoload($className)
{
echo 3;
if (is_file('./lib/' . $className . '.php')) {
require './lib/' . $className . '.php';
}
}
//注册了3个
spl_autoload_register('load1');
spl_autoload_register('load2');
spl_autoload_register('__autoload');
$db = new DB(); //DB就在本目录下
$info = new Info(); //Info 在/lib/Info.php
我们注册了3个自动加载函数。执行结果是啥呢?
1Hello DB
123Hello Info
当然这个结果是怎么来的的让我们分析一下
new DB的时候,就按照注册顺序,先去找load1()函数了,发现找到了,就停止了,所以输出1 Hello
new Info的时候,先是安装注册顺序,先找load1(), 所以输出了1,发现没找到,就去load2()里面去找,所以输出了2,
还是没这个文件,就去__autoload()函数里找,所以,先输出了3,再输出Hello Info
注意:spl_autoload_register使用时,__autoload会无效,有时候,我们希望它继续有效,就可以也将它注册进来,就可以继续使用