2013-06-05 16 views
2

我有一個看起來像這樣的抽象基類的一部分:如何實現執行抽象PHP方法的標誌?

abstract class Fragment_Cache { 

    static $in_callback = false; 

    abstract public function callback($name, $args); 
} 

我需要callback()方法執行過程中翻轉$in_callbacktrue。這被用在代碼的其他部分,以防止嵌套緩存(所以我想緩存小部件和菜單,但不是窗口部件內的菜單)。

但是由於它是抽象方法,我不能依賴子類實現。

我也不能在方法調用周圍打開/關閉標誌,因爲它是由不同的庫傳遞和執行的,而不同的庫負責運行它的異步,而不是在頁面加載期間。

我該如何構建自己走出這個角落? :)

實際怪物,設置它的呼叫:

$output = tlc_transient('fragment-cache-' . $this->type . '-' . $name . $salt) 
      ->updates_with(array($this, 'callback'), array($name, $args)) 
      ->expires_in($this->timeout)->get(); 
+0

您能否提供一個如何在您的代碼中使用此方法的示例? –

+0

@OneTrickPony添加了如何調用 – Rarst

+1

的問題並且您可以使用'array($ this,'wrappingCallback')''來更改'array($ this,'callback')'嗎? –

回答

5

約在另一個函數隱藏了實際功能如何?

abstract class Fragment_Cache { 

    static $in_callback = false; 

    public function callback($name, $args) 
    { 
     self::$in_callback = true; 
     $this->doCallback($name, $args); 
     self::$in_callback = false; 
    } 

    abstract protected function doCallback($name, $args); 
} 

你需要覆蓋doCallback,這將做實際的繁重工作,而不是直接訪問從外面看,只能通過callback

+1

4個按鍵之內與我即將發佈的內容相同 – Orangepill

+0

不同的地雷不同 – Orangepill

+0

如果函數沒有解決您的問題,您還沒有創建足夠的。 :)似乎工作桃子!雖然我確實需要回到那裏,也許到最後的包裝到這個子類別不會搞砸了。 – Rarst

2
abstract class Fragment_Cache { 

    static $in_callback = false; 

    public function callback($name, $args){ 
     self::$in_callback = true; 
     $ret = $this->__doCallback($name, $args); 
     self::$in_callback = false; 
     return $ret; 
    } 

    abstract protected function __doCallback($name, $args); 
} 
+0

區別在於保存了內部函數的返回值。 – Maerlyn

+0

是的......偉大的思想(和同樣瘋狂的)思想相似 – Orangepill