我有一个php文件,里面有多个类。我注意到,当我实例化任何类时,即使在'package'文件被自动加载之后,也会调用__autoload。这让我很担心,因为如果已经加载了初始的'package'.php文件,那么当已经加载了类时__autoload是不必要的开销。
我可能已经解释了这个,所以这是一个例子:
<?php
class Class1{};
class Class2{};
?>
然后在另一个文件中:
<?php
new Class1;
new Class2;
?>
__ autoload将用于Class1和Class2的实例化......即使它们位于同一个文件中。
有没有办法解决这个问题?
对不起,如果我的解释不是很好,我真的很感激任何帮助或提示。
答案 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
如果你得到不同的结果,那么有些东西你没有告诉我们。