php中__autoload()方法详解

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、如果类名称和用户的输入有关——或者依赖于用户的输入,一定要注意检查输入的文件名,例如:.././这样的文件名是非常危险的。







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值