2012-05-21 56 views
2

有很多子類調用覆蓋父方法的例子,最常見的是parent::__construct()。然而,在這些情況下,您實際上是從孩子本身的具體方法調用父母。我可以使用繼承的方法遞歸調用一個從子對象到父對象的方法嗎?

有沒有一種方法,我可以遞歸調用一個方法從孩子到第一個祖先,使用繼承的方法?

如果我在抽象父類中使用parent::methodName(),它會導致一個致命錯誤,說'當前類作用域沒有父對象時不能訪問父::。大概這是因爲'parent'正在被評估爲相對於抽象類本身,而不是當前的類上下文。

謝謝...

+1

你認爲如何調用未實現的方法(抽象)? – Johntor

+0

謝謝@Johntor,對吧。請參閱上面的編輯。 –

回答

0

也許致電parent像這樣? (未經測試)

foreach (get_class_parents($this) as $className) { 
    (new ReflectionMethod($className, __METHOD__))->invoke($this, $args...); 
} 

我討厭當我看到這個有點垃圾的代碼。

1

我不太清楚你想要做什麼,但:相對於它在發生類

  1. parent關鍵字進行評估。如果類您使用parent關鍵字中沒有父級,顯然不起作用。
  2. 如果您想要孩子使用父母的方法,請不要在孩子中重寫該方法。在父項中定義一個強制子項調用父項方法的方法是沒有意義的,當你需要做的只是不重寫子項中的方法。
  3. 您可以通過使方法final強制父母的方法成爲「最後的單詞」,孩子將無法覆蓋它。
  4. 孩子不能稱爲「祖父母」的方法,因爲孩子不知道,或至少沒有保證,其父母依次有父母。

在實際應用中,這意味着:

  1. 如果你正在寫一類,沒有extend另一個類,它沒有任何意義,以它在任何地方使用parent
  2. 如果您是extend並且不重寫某個方法,則會自動使用父項的方法(它是繼承的)。
  3. 如果你是extend荷蘭國際集團的一類,並重寫一個方法,你可以「從覆蓋的方法,這反過來又可以調用parent S分析的方法等
相關問題