参考:http://www.php100.com/html/php/lei/2013/0905/5267.html加上一点点自己的理解和疑惑
Class_1.php
<?php
class Class_1
{
function __construct()
{
echo "Class_1";
}
public function test(){
echo "class1";
}
}
?>
Class_2.php
<?php
class Class_2 extends Class_1
{
function __construct()
{
echo "Class_2";
}
}
?>
如果要在main.php文件中使用的Class_1类的话,要先requireClass_1文件和Class_2文件,不然会报错
但是用__autoload方法的话,只需要
main.php
<?php
function __autoload($name){
$path='./'.$name.'.php';
if(file_exists($path)){
require_once $path;
}else{
echo $path.':该文件不存在';
}
}
//$obj_1=new Class_1();
$obj_2=new Class_2();
$obj_2->test();
?>
__autoload函数回在实例化对象之前执行,而且这里没有实例化Class_2的时候并没有先实例化Class_1,说明还没有导入Class_1.php文件,但是
不会报错,说明在导入对象的时候回去判断导入当前对象继承的对象的相应php文件,不过要注意的是,这里的Class_1和Class_2是在同一级目录下的,如果不是同一级目录的话,还是会报错
另外一个需要注意的是,类名和类的文件名必须一致,才能更方便的使用魔术函数__autoload;
2014/11/4
在定义了命名空间的文件定义autoload函数
<?php
namespace zj;
use zj_2;
class class_1{
function __construct(){
echo "string";
}
}
function __autoload ( $class_name ) {
echo "this is autoload";
require_once $class_name.'.php';
}
spl_autoload_register('zj\__autoload');
$temp=new zj_2\class_2();
输出:
this is autoloadclass_2
另外一提,class_exists函数也会触发autoload函数
<?php
namespace zj;
use zj_2;
class class_1{
function __construct(){
echo "string";
}
}
function __autoload ( $class_name ) {
echo "this is autoload";
require_once $class_name.'.php';
}
spl_autoload_register('zj\__autoload');
//$temp=new zj_2\class_2();
var_dump(class_exists('zj_2\class_2'));
?>
输出:
this is autoload
boolean true