2012-03-27 80 views
2

我正在一個MVC應用程序中使用抽象基類實現模型,所有實際模型必須擴展。在每個模型中都有關於該模型的一些信息,目前作爲一個數組實現,讓我們調用protected static $info。所以,每個型號都有不同的$info陣列。現在,基類有很多使用該數組的數據的函數,並且此刻每個函數都以類似下面的示例save()函數開始。將PHP的特點是一個很好的解決方案

abstract class BaseModel { 
    function save(){ 
     $className = get_called_class(); 
     $modelInfo = $className::$info; 
     /* lots of other stuff */ 
    } 
} 

class User extends BaseModel { 
    protected static $info = array("tableName" => "tblUsers", etc...) 
} 

在我的理解,這可以通過使BaseModel一個特徵,而不是一個構造函數,因爲當特性定義static性能得到解決,每個繼承類確實有自己的價值觀。我會將$info數組從模型的實現複製到特徵,可能在構造函數中,這樣我就可以在BaseModel的所有函數中使用self::info['tableName'] ...

這是個好主意嗎?

回答

6

作業的最簡單和最合適的工具是使用late static binding

function save(){ 
    $modelInfo = static::$info; 
    /* lots of other stuff */ 
} 
+0

大,這個工程。我感到有點慚愧,我沒有自己想出這個。謝謝! – 2012-03-28 07:26:03

+0

@Lex:其實你確實想到了它,你的代碼和後期靜態綁定在幕後做的事情完全一樣。 ;) – Jon 2012-03-28 07:29:11

相關問題