PHP在魔术函数__autoload()方法出现以前,如果要在一个程序文件中实例化100个对象,必须用include或者require包含进来100个类文件,或者把这100个类定义在同一个类文件中——相信这个文件一定会非常大。
但是__autoload()方法出来了,以后就不必为此大伤脑筋了,这个类会在实例化对象之前自动加载指定的文件。
例子(具体的使用方法)
./test/ClassA.php
<?php
//定义一个类ClassA,文件名为ClassA.php
class ClassA{
public function __construct(){
echo "ClassA load success!<br/>";
}
}
?>
./test/ClassB.php
<?php
//定义一个类ClassB,文件名为ClassB.php,ClassB继承ClassA
class ClassB extends ClassA {
public function __construct(){
//parent::__construct();
echo "ClassB load success!<br/>";
}
}
?>
test__autoload.php
<?php
function __autoload($classname){
$classpath="./test/".$classname.'.php';
if(file_exists($classpath)){
require_once($classpath);
}
else{
echo 'class file'.$classpath.'not found!<br/>';
}
}
$newobj = new ClassA();
$newobj = new ClassB();
?>
运行结果:
ClassA load success!
ClassB load success!
注意的问题
1、如果类存在继承关系(例如:ClassB extends ClassA),并且ClassA不在ClassB所在目录,利用__autoload魔术函数实例化ClassB的时候就会抛出一个致命错误:
Fatal error: Class 'ClassA' not found in C:\wamp\www\test\ClassB.php on line 3
解决方法:把所有存在extends关系的类放在同一个文件目录下,或者在实例化一个继承类的时候在文件中手工包含被继承的类;
2、类名和类的文件名必须一致,才能更方便地使用魔术函数__autoload;
3、在CLI模式下运行PHP脚本的话这个方法无效;(http://stackoverflow.com/questions/14696961/why-doesnt-phps-autoload-feature-work-in-cli-mode 不是所有的CLI模式下都是无效的)
4、如果类名称和用户的输入有关——或者依赖于用户的输入,一定要注意检查输入的文件名,例如:.././这样的文件名是非常危险的。