热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP魔术函数__autoload的用法与一些问题

本文章来讲述php5的一个新的功能,我们来介绍PHP魔术函数__autoload的用法与一些问题,下面给大家总结了用法过程中出现的一些问题与注意事项

本文章来讲述php5的一个新的功能,我们来介绍PHP魔术函数__autoload的用法与一些问题,下面给大家总结了用法过程中出现的一些问题与注意事项。

__autoload()用法,php手册中的一些讲讲法:

自动加载对象,很多开发者写面向对象的应用程序时对每个类的定义建立一个 PHP 源文件,一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件列表。

在 PHP 5 中,不再需要这样了。可以定义一个 __autoload 函数,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。

Note:在 __autoload 函数中抛出的异常不能被 catch 语句块捕获并导致致命错误。

Note:如果使用 PHP 的 CLI 交互模式 时,Autoloading 不存在。

Example #1 Autoload 例子,本例尝试分别从 MyClass1.php 和 MyClass2.php 文件中加载 MyClass1 和 MyClass2 类。

  1. function __autoload($class_name) { 
  2.     require_once $class_name . '.php'
  3. $obj  = new MyClass1(); 
  4. $obj2 = new MyClass2(); 
  5. ?> 

PHP在魔术函数__autoload()方法出现以前,如果你要在一个程序文件中实例化100个对象,那么你必须用include或者require包含进来100个类文件,或者你把这100个类定义在同一个类文件中——相信这个文件一定会非常大。

但是__autoload()方法出来了,以后就不必为此大伤脑筋了,这个类会在你实例化对象之前自动加载制定的文件。

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

  1.  //定义一个类ClassA,文件名为ClassA.php 
  2. class ClassA{ 
  3.  public  function __construct(){ 
  4.   echo "ClassA load success!"
  5.  } 
  6.  //定义一个类ClassB,文件名为ClassB.php,ClassB继承ClassA 
  7. class ClassB extends ClassA { 
  8.  public function __construct(){ 
  9.   //parent::__construct(); 
  10.   echo "ClassB load success!"
  11.  } 

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

  1.  function __autoload($classname){ 
  2.  $classpath="./".$classname.'.php'
  3.  if(file_exists($classpath)){ 
  4.   require_once($classpath); 
  5.  } 
  6.  else
  7.   echo 'class file'.$classpath.'not found!'
  8.  } 
  9.  
  10. $newobj = new ClassA(); 
  11. $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、如果你的类名称和用户的输入有关——或者依赖于用户的输入,一定要注意检查输入的文件名,例如:.././这样的文件名是非常危险的。

__autoload的问题

__autoload魔术方法或者你愿意称他为魔术函数,太专一了。当他加载需要包含的类文件时,甚至不管类文件中定义类之外的其它声明,开始回放这个机制。

首先我们在创建一个Test.class.php文件,键入如下内容

  1. $publicPara='中共十七大啥时候召开的?'
  2. class Test{ 
  3.  public function  __construct(){ 
  4.   global $publicPara
  5.   if(isset($publicPara)){ 
  6.    echo $publicPara
  7.   } 
  8.   else
  9.    echo "管我啥事儿了?"
  10.   } 
  11.  } 
  12. }  

记得保存这个文件哦,然后重新建立一个文件命名为do.php键入如下内容:

  1.  
  2. require_once('Test.class.php'); 
  3. new Test();  
  4. ?> 

这样的话输出的正如我们期望的那样是,中共十七大啥时候召开的?但是当你用到__autoload这个魔术方法的时候,问题就出来了

  1.  
  2. function __autoload($classname){ 
  3. require_once($classname.".class.php"); 
  4. new Test();  
  5. ?> 

这次的输入居然是:管我啥事儿了?很显然他忽略了我们在class外定义的变量,也就是他只把我们需要序列化的类加载进来,而不管其他的声明了,也仅仅是其他的声明而已,诸如echo了啥的都还是执行的


推荐阅读
  • 深入解析PHP Xdebug的安装与应用
    本文详细介绍了PHP Xdebug的安装步骤及其在PHP开发中的重要作用。Xdebug作为一款强大的调试工具,不仅能够帮助开发者追踪代码执行过程,还能有效提升代码质量和系统性能。 ... [详细]
  • 本文对唐代诗人王建的《泛水曲》进行详细的赏析和翻译,探讨其文学价值及艺术特色。 ... [详细]
  • 本文探讨了HDU 4035的问题,涉及一个由n个房间组成的迷宫,这些房间通过n-1条隧道相互连接,形成一棵树结构。任务是从起点1号房间出发,计算到达出口所需经过的平均隧道数量,考虑了在每个房间中可能发生的三种情况及其相应概率。 ... [详细]
  • 软件项目管理实践——Jenkins持续集成与Maven、GitHub的应用
    本文详细介绍了如何利用Jenkins实现持续集成,以及Maven和GitHub在项目开发中的具体应用。包括环境搭建、工具安装、项目创建及代码管理等关键步骤。 ... [详细]
  • 本文详细介绍了在Hive中创建表的基本语法,包括临时表、外部表的创建方法,以及如何设置表的各种属性和约束条件。 ... [详细]
  • 浩方对战平台账户注册指南
    作为一款深受学生和年轻人喜爱的游戏对战平台,浩方对战平台不仅提供了如《魔兽RPG》、《星际争霸》等经典游戏的对战环境,还是许多玩家交流技巧、结交朋友的好去处。本文将详细介绍如何轻松完成浩方对战平台的账户注册。 ... [详细]
  • InnoDB中Serializable隔离级别的实现机制
    在数据库的最高隔离级别——Serializable下,当一个事务(如事务A)正在对某一行进行修改时,任何其他试图读取或修改该行的事务(如事务B)都必须等待,直到事务A完成并释放其写锁。这一机制确保了所有操作都能以一种线性化的顺序执行,避免了并发带来的数据不一致问题。 ... [详细]
  • Kafka 示例项目中 Log4j 的配置与调试
    本文详细介绍了如何在 Kafka 源码中的示例项目配置 Log4j,以确保能够正确记录日志信息,帮助开发者更好地理解和调试代码。 ... [详细]
  • 本文介绍如何利用Python中的Epoll机制构建一个高效的Web服务器,该服务器能够处理多个并发连接,并向每个连接的客户端返回预定义的响应文本。通过使用Epoll,服务器可以实现高性能的I/O多路复用。 ... [详细]
  • 多版本CUDA共存与即时切换方案
    本文探讨了在同一台机器上安装并管理多个CUDA版本的方法,以适应不同软件或项目的需求。特别是在使用旧版PyTorch等依赖特定CUDA版本的软件时,该方法尤为实用。 ... [详细]
  • 一、数据更新操作DML语法中主要包括两个内容:查询与更新,更新主要包括:增加数据、修改数据、删除数据。其中这些操作是离不开查询的。1、增加数据语法:INSERTINTO表名称[(字 ... [详细]
  • 本文提供了唐代诗人高瑾的《晦日重宴》一诗的现代汉语翻译及其艺术特点的赏析。 ... [详细]
  • 本文详细介绍了如何通过Percona插件监控MySQL 5.7数据库,包括环境准备、插件安装、配置调整及数据测试等步骤,旨在为用户提供一个高效且稳定的监控解决方案。 ... [详细]
  • 本文介绍了如何通过安装 VirtualBox 和 Vagrant 来快速搭建和管理虚拟机环境。我们将详细探讨如何选择合适的 Box 镜像,以及如何高效地下载、添加和管理这些镜像。 ... [详细]
  • Django框架的使用教程mysql数据库[三]
    Django的数据库1.在Django_test下的view.py里面model定义模型fromdjango.dbimportmodels#Createyourmodelshere ... [详细]
author-avatar
峰的紫色摩天轮
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有