2014-01-23 33 views
0

假設我有一個簡單的類作爲有條件覆蓋方法在PHP

class Master { 
    public $variable; 
    public function a_method() { 
     // some code here 
    } 
} 

和子類覆蓋父方法

class Child extends Master { 
    public function a_method() { 
     // some other code 
    } 
} 

現在,$child_object = new Child()實例化Child類,如果我調用方法$child_object->a_method()當然重寫的代碼將被執行。如果我有條件地想要調用父方法而不是孩子的方法,則取決於(例如)值$child_object->variable,但僅在Master::a_method()內表示條件?簡單來說,我想是這樣

class Master { 
    public $variable; 
    public function a_method() { 
     if ($this->variable) { 
      // execute the child's method if you are in an inherited scope 
     } else { 
      // some code here 
     } 
    } 
} 

我知道,作用於孩子的方法,這將是微不足道的,調用parent::a_method()條件塊裏面,但我希望孩子的方法是盲目的,以該條件。

+2

這聽起來像是一個非常破碎的抽象。您試圖在父類中創建對子類的依賴關係,這不是一個好主意。 (父類應該沒有關於子類的知識,更不用說依賴它了。)根據你想要解決的問題,我想有一種解決它的模式。也許你希望父/子類型(在這種情況下應該是多態不可區分的)由另一個對象上的工廠提供,條件應該在*那個*對象上? – David

+0

可能的重複[如何從一個繼承的方法中調用PHP父方法?](http://stackoverflow.com/questions/8265351/how-do-i-call-php-parent-methods-from-within-一個繼承的方法) –

+0

在愚蠢的答案應該顯示如何調用一個重寫方法的父副本。 –

回答

0

您正在根據變量的值做兩件不同的事情。我建議將這兩種東西分解爲單獨的方法,然後您不必擔心重疊的名稱,並且可以分別在子類中進行擴展。就像這樣:

class Master 
{ 
    public $var; 
    public function method() 
    { 
     if ($this->var) { 
      $this->trueMethod(); 
     } else { 
      $this->falseMethod(); 
     } 
    } 
    protected function trueMethod() { } 
    protected function falseMethod() { } 
} 

class Child extends Master 
{ 
    protected function trueMethod() 
    { 
    } 
} 

就你而言,當$ var爲false時,你永遠不想運行子代碼。因此,將$ var爲false時運行的代碼拆分爲它自己的方法,並且不要在子代中覆蓋它。