如何跳过__autoload?

时间:2009-10-20 22:24:49

标签: php

我有一个php文件,里面有多个类。我注意到,当我实例化任何类时,即使在'package'文件被自动加载之后,也会调用__autoload。这让我很担心,因为如果已经加载了初始的'package'.php文件,那么当已经加载了类时__autoload是不必要的开销。

我可能已经解释了这个,所以这是一个例子:

<?php
class Class1{};
class Class2{};
?>

然后在另一个文件中:

<?php
new Class1;
new Class2;
?>

__ autoload将用于Class1和Class2的实例化......即使它们位于同一个文件中。

有没有办法解决这个问题?

对不起,如果我的解释不是很好,我真的很感激任何帮助或提示。

2 个答案:

答案 0 :(得分:4)

如果某个类不存在,则只应调用PHP的自动加载。换句话说,对于最基本的示例,它使用与以下相同的逻辑:

if( !class_exists("Class1") )
    require "path\Class1.php"; 

如果您发现其他情况,我会检查以确保您正确执行所有操作并报告错误。

来自PHP.net/autoload(重要文件突出显示):

  

在PHP 5中,不再需要这样做。   您可以定义__autoload函数   这是自动调用以防万一   你正试图用一个   类/接口尚未   已定义。通过调用此   函数脚本引擎给出   以前加载课程的最后机会   PHP失败并出现错误。

格式化错误,但重点是“尚未定义”。编译类时会发生“已定义”(在大多数情况下,包含所述类的文件时)。

答案 1 :(得分:1)

__ autoload绝对不是第二次调用,当Class2被定义为第一次调用的结果时。

First classes.php

<?php
class Class1 {};
class Class2 {};

现在test.php

<?php
function __autoload ($class)
{
    print "Autoloading $class\n";
    require 'classes.php';

}

$a = new Class1;
$b = new Class2;

print get_class($b);

运行test.php时,结果为:

Autoloading Class1
Class2

如果你得到不同的结果,那么有些东西你没有告诉我们。