博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php中__autoload()方法详解
阅读量:7092 次
发布时间:2019-06-28

本文共 1245 字,大约阅读时间需要 4 分钟。

PHP在魔术函数__autoload()方法出现以前,如果你要在一个程序文件中实例化100个对象,那么你必须用include或者require包含进来100个类文件,或者你把这100个类定义在同一个类文件中——相信这个文件一定会非常大。
但是__autoload()方法出来了,以后就不必为此大伤脑筋了,这个类会在你实例化对象之前自动加载制定的文件。

下边我们通过一个例子来看一下,具体的使用方法,并在稍后说明使用PHP魔术函数__autoload应该注意些什么。

 代码如下 复制代码

 //定义一个类ClassA,文件名为ClassA.

class ClassA{
 public  function __construct(){
  echo "ClassA load success!";
 }
}

 //定义一个类ClassB,文件名为ClassB.php,ClassB继承ClassA

class ClassB extends ClassA {
 public function __construct(){
  //parent::__construct();
  echo "ClassB load success!";
 }
}

定义两个测试用的类之后,我们来编写一个含有__autoload()方法的PHP运行程序文件如下:

 代码如下 复制代码

 function __autoload($classname){

 $classpath="./".$classname.'.php';
 if(file_exists($classpath)){
  require_once($classpath);
 }
 else{
  echo 'class file'.$classpath.'not found!';
 }
}
 
$newobj = new ClassA();
$newobj = new ClassB();

这个文件的运行是一点问题都没有的,可见autoload是多么的好用啊,呵呵……

但是不得不提醒你一下几个方面是必须要注意的。

1、如果类存在继承关系(例如:ClassB extends ClassA),并且ClassA不在ClassB所在目录

利用__autoload魔术函数实例化ClassB的时候就会受到一个致命错误:

 代码如下 复制代码
Fatal error: Class ‘Classd’ not found in ……ClassB.php on line 2,

解决方法:把所有存在extends关系的类放在同一个文件目录下,或者在实例化一个继承类的时候在文件中手工包含被继承的类;

2、另外一个需要注意的是,类名和类的文件名必须一致,才能更方便的使用魔术函数__autoload;

其他需要注意的事情:

3、在CLI模式下运行PHP脚本的话这个方法无效;

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

转载地址:http://uniql.baihongyu.com/

你可能感兴趣的文章
2017年度 OSC 源创会计划,技术干货精彩纷呈
查看>>
为什么说产品化是私有IaaS的唯一出路?
查看>>
阿里云联手学而思东家,给学习加点新元素
查看>>
C++语言基础 例程 案例:MyVector类的设计
查看>>
阿里云中间件产品ARMS公测 实时监控“一站式”解决
查看>>
shiro+ehcache缓存 和 验证码 和 记住我
查看>>
200多个js技巧代码(五)
查看>>
数据库设计原理:数据建模的三个阶段
查看>>
sendmail配置和学习
查看>>
MD5工具类
查看>>
邮件归档体现数据价值
查看>>
Executors 创建单例线程newSingleThreadExecutor
查看>>
Openstack(两控制节点+四计算节点)-4 模拟控制节点宕机
查看>>
Scribe快速安装方法
查看>>
5-1 array 数组的基本概念
查看>>
httpclient4.3 设置cookie
查看>>
dd懒也是一种境地
查看>>
使用SQL语句中的Group by分组并计算每组的数量
查看>>
ThinkPHP自定义标签
查看>>
Ioc容器
查看>>