__autoload及spl_autoload_register
2017-05-14 本文已影响110人
一只好奇的茂
之前在项目中,都是使用include_once来导入其他class,导致项目中每一个文件都include_once了很多其他文件,最近发现使用spl_autoload_register后,每个文件只需要多定义并调用一个方法即可,具体使用方法如下:
简介
一般情况下,都用spl_autoload_register来取代_ _autoload()了,因为spl_autoload_register 可以很好地处理需要多个加载器的情况,这种情况下 spl_autoload_register 会按顺序依次调用之前注册过的加载器。作为对比, __autoload 因为是一个函数,所以只能被定义一次。
用法
__autoload()
我把很多个类文件以 类名.class.php的形式存放在class目录中,在class的同级目录中建立一个index.php。进入class目录里面分别建立class1.class.php、class2.class.php、class3.class.php文件,分别为里面的文件添加一下代码
<?php
//class1.class.php中
class class1{
public function __construct(){
echo "class1";
}
}
?>
<?php
//class2.class.php中
class class2{
public function __construct(){
echo "class2";
}
}
?>
<?php
//class3.class.php中
class class3{
public function __construct(){
echo "class3";
}
}
?>
index.php文件中写入
<?php
function __autoload($classname){
$filename = "./class/".$classname.".class.php";
if(is_file($filename)){
include $filename;
}
}
$test1 = new class1();
echo '<br/>';
$test1 = new class2();
echo '<br/>';
$test1 = new class3();
/*
结果是
class1
class2
class3
*/
?>
我们成功的自动加载了class下面所有的要加载的类。
spl_autoload_register()
class里面的文件不做任何改变,只是简单的改写一下index.php
<?php
// 写一个loadclass函数
// loadclass函数不具备自动加载类的功能
function loadclass($classname){
$filename = "./class/".$classname.".class.php";
if(is_file($filename)){
include $filename;
}
}
// spl_autoload_register()函数让这个loadclass具备了自动加载类的功能
spl_autoload_register("loadclass");
$test1 = new class1();
echo '<br/>';
$test1 = new class2();
echo '<br/>';
$test1 = new class3();
?>
后记
因为在每个文件中都定义或调用spl_autoload_register()或autoload()还是显得太麻烦,在后面的开发中,我发现了一个更简单的办法---使用composer来构建项目,这样只需要在每个文件中,加入
require_once __DIR__.'/vendor/autoload.php';
即可。
具体做法可参考官方文档:composer基本用法