2012-11-21 23 views
6

此消息顯示在PHP 5.4抽象。嚴格的標準:靜態函數模型:: tableStruct()不應該爲一些奇怪的原因是

我的類看起來是這樣的:

abstract class model{ 

    private static 
    $tableStruct = array(); 

    abstract protected static function tableStruct(); 

    public static function foo(){ 
    if(!isset(self::$tableStruct[get_called_class()])) 
     self::$tableStruct[get_called_class()] = static::tableStruct(); 

    // I'm using it here!! 
    } 

} 

,應該使用這樣的:

class page extends model{ 

    protected static function tableStruct(){ 
    return array(
     'id' => ... 
     'title' => ... 
    ); 
    } 

    ... 

} 

使得由子類需要一個靜態方法,爲什麼被認爲是對標準?

+0

這不只是5.4,它已經這樣了一段時間。見[類似問題](http://stackoverflow.com/questions/999066/why-does-php-5-2-disallow-abstract-static-class-methods)。 –

回答

7

摘要靜態方法是一種奇怪的概念。靜態方法基本上是「硬編碼」的方法類,確保只有一個實例(〜單身)。但把它抽象化意味着你想要強制其他類來實現它。

我看到你正在嘗試做的,而是用抽象類打交道時,我會避免在基類的靜態方法。你可以做的是使用後期靜態綁定(static::)來調用「child」類中的tableStruct方法。這並不強制要像抽象的實現確實的方法,但你可以測試實施並拋出一個異常,如果它不存在。

public static function foo(){ 
    // call the method in the child class 
    $x = static::tableStruct(); 
} 
+0

「......與抽象類打交道時,我會避免在基類[摘要]靜態方法。」 您能否給出一個使用抽象靜態方法會傷害的實際示例? – user151851

+1

靜態引用創建緊密耦合。靜態方法通常會使測試變得困難,因爲很難用模擬對象替換類。 –

3

對於它的價值......

濫用接口:

interface Imodel { 

    static function tableStruct();   
} 

abstract class model implements Imodel { 

    private static $tableStruct = array(); 

    public static function foo() { 
     if (!isset(self::$tableStruct[get_called_class()])) 
      self::$tableStruct[get_called_class()] = static::tableStruct(); 

     // I'm using it here!! 
    } 
} 
相關問題