2012-08-26 72 views
1

我有以下的困境:PHP __autoload不輸出緩衝處理函數內工作

ob_start('processBuffer'); 

function processBuffer($buffer){ 

    $betterBuffer = SomeClass::doSomething($buffer); 
    return $betterBuffer; 

} 

function __autoload($className){ 

    if($className == 'SomeClass'){ include_once 'some_class.php'; } 

} 

如果類SomeClass的,必須內processBuffer加載的第一次,這是行不通的,但如果它的工作必須在processBuffer函數執行之前加載。這是爲什麼?目前,爲了解決這個問題,我必須做到以下幾點:

__autoload('SomeClass'); 
ob_start('processBuffer'); 

我該如何解決這個問題?

+4

你不需要直接調用'__autoload()'函數;簡單地定義它應該足以讓PHP調用它。但是,PHP建議不要再使用'__autoload';相反,你應該編寫函數並將它們傳遞給'spl_autoload_register()'。這對於很多方面來說都更好,包括允許你擁有多個自動加載函數,這是舊的'__autoload()'機制所無法實現的。 – Spudley

+0

值得一提的是,一旦_anything_調用'spl_autoload_register()''-_autoload()'被完全禁用。 – KingCrunch

回答

2

這很可能是由PHP內部分層引起的。在輸出階段,在執行堆棧的末尾調用緩衝區處理函數。它與錯誤處理函數類似,關於它們可以做什麼和不可以做什麼,錯誤處理函數有更好的記錄。例如(雖然我沒有測試過),但我期望緩衝區處理函數也不能回顯東西(可以,但輸出可能不會去任何地方)。

+0

對於最後一點你絕對正確,輸出處理程序中的任何輸出都將導致致命錯誤:「不能在輸出緩衝顯示處理程序中使用輸出緩衝。」 – Niko

+0

是的,儘管對於最後一點,要回顯的文本可以簡單地附加到緩衝區。 – arik

0

選項1 - 「完全面向對象」。

在這種情況下,所有的緩衝過程都是從課堂內部控制的。選項2「__autoload()」。

緩衝不在類中,而是在__autoload()魔法函數內部開始。

function __autoload($class){ 
    ob_start(); 
    if($class == 'SomeClass'){ 
     include_once 'some_class.php'; 
    } 
} 

$c = new SomeClass(); 
// . . . 
ob_end_flush(); 

正如你可以看到http://php.net/manual/en/function.ob-start.phpob_start()可調用的函數將在ob_end_flush()被調用。

+0

恐怕選項2可能會生成一個巨大的ob堆棧(每個類通過'__autoload()'加載一個ob層)。選項1是一致的,它可能會或可能不會工作,這取決於OP的需求 - 但是您是否真的在析構函數中測試了刷新?聽起來可能(儘管它可能工作)。 – Gutza

+0

我在'選項1'的方式中使用了緩衝,只有區別,我在公共方法中調用了與__destruct不同的方法。我正在使用緩衝區取消和輸出大小測量實現。一切正常。 –