2009-10-20 37 views
0

我有一個php文件,裏面有多個類。我注意到__autoload在實例化任何類時被調用,即使'package'文件已被自動加載。這讓我很擔心,因爲如果已經加載了初始'package'.php文件,那麼當類已經被加載時__autoload是不必要的開銷。如何跳過使用__autoload?

我大概做解釋的哈希值,所以這裏有一個例子:

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

然後在另一個文件:

<?php 
new Class1; 
new Class2; 
?> 

__autoload將同時用於1類和類2的實例..即使他們被安置在同一個文件中。

有沒有辦法解決這個問題?

對不起,如果我的解釋不是很好,我非常感謝任何幫助或提示。

回答

4

只有當類不存在時才應該調用PHP的自動加載。換句話說,對於最基本的例子,它使用的是相同的邏輯:

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

如果您發現,否則,我會檢查,以確保您正確地做的一切,並報告的錯誤。

從PHP.net/autoload(重要文檔高亮):

在PHP 5中,這不再是必要的。 你可以定義一個__autoload函數 被自動調用的情況下, 您正在嘗試使用尚未 尚未定義的 類/接口。通過調用這個 函數,腳本引擎被賦予 最後一次加載該類的機會,之後 PHP失敗並出現錯誤。

格式錯誤,但重點是「哪些尚未定義」。編譯類時會出現「定義」(在大多數情況下,當包含所述類的文件被包含時)。

1

__autoload絕對不會被第二次調用,當Class2被定義爲第一次調用的結果時。

首先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 

如果您收到不同的結果,那麼有些東西你沒有告訴我們。