2016-11-26 131 views
1

我有一個包含各種私有函數的靜態類。這些被公共職能調用。我想允許更改其中一個私有函數的選項。無論是使用擴展類還是其他方式。更改基於擴展類的父類方法行爲(靜態)

這是我這是不工作電流的嘗試,但希望證明什麼,我想要的目的。

class OriginalClass { 

    public static function go() 
    { 
     self::doThis(); 
     self::doThat(); 
     self::doOther(); 
    } 

    private static function doThis() 
    { 
     echo 'this' . PHP_EOL; 
    } 

    private static function doThat() 
    { 
     echo 'that' . PHP_EOL; 
    } 

    private static function doOther() 
    { 
     echo 'default' . PHP_EOL; 
    } 
} 

class ExtendedClass extends OriginalClass { 

    private static function doOther() 
    { 
     echo 'other' . PHP_EOL; 
    } 
} 

ExtendedClass::go(); 

我想獲得是

this 
that 
other 

,但我發現

this 
that 
default 

我想OriginalClass能夠直接使用,但我想給出能夠改變doOther()所做的選項。我不介意如何,我只是試圖保持代碼清潔,不做任何事情。

任何想法?

回答

1

doOther私人在這兩個類的方法。私人方法是不可訪問除了類,它們在哪裏定義。

因此doOtherExtendedClass上下文不可從OriginalClass上下文訪問。這就是爲什麼go方法不能訪問ExtendedClass::doOther,所以它在OriginalClass其中存在搜索doOther

所以,應該做哪些改變:

  1. ExtendedClass::doOther應至少protected是availble的在OriginalClass背景。

  2. self關鍵字是指OriginalClass類,使用late static binding獲得其要求的方法


class OriginalClass { 

    public static function go() 
    { 
     self::doThis(); 
     self::doThat(); 
     static::doOther(); // keyword `static` 
    } 

    private static function doThis() 
    { 
     echo 'this' . PHP_EOL; 
    } 

    private static function doThat() 
    { 
     echo 'that' . PHP_EOL; 
    } 

    private static function doOther() 
    { 
     echo 'default' . PHP_EOL; 
    } 
} 

class ExtendedClass extends OriginalClass { 

    protected static function doOther() // `protected` visiblity 
    { 
     echo 'other' . PHP_EOL; 
    } 
} 

ExtendedClass::go(); 
// output: 
// this 
// that 
// other 

OriginalClass::go(); 
// this 
// that 
// default 
+0

一個真正的類的名稱驚人的 - 感謝您的回答和解釋! – Steve