好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

PHP魔术函数__autoload的用法与一些问题 - php面向对

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 类。

<?php  function  __autoload( $class_name ) {       require_once   $class_name  .  '.php' ;  }  $obj   =  new  MyClass1();  $obj2  =  new  MyClass2();  ?> 

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

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

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

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

__autoload的问题

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

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

$publicPara = '中共十七大啥时候召开的?' ;  class  Test{    public   function   __construct(){     global   $publicPara ;     if (isset( $publicPara )){      echo   $publicPara ;    }     else {      echo   "管我啥事儿了?" ;    }   }  }  

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

 <?php  require_once ( 'Test.class.php' );  new  Test();   ?> 

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

 <?php  function  __autoload( $classname ){  require_once ( $classname . ".class.php" );  }  new  Test();   ?> 

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

查看更多关于PHP魔术函数__autoload的用法与一些问题 - php面向对的详细内容...

  阅读:36次