簡體   English   中英

PHP擴展了一個從另一個類調用的類方法,該類方法對其進行擴展並使用parent :: method調用該方法

[英]PHP extend a class method that is called from another class which extends it and calls the method with parent::method

我試圖擴展一個類並重寫其方法之一。 讓我們稱該類為A。我的類B為覆蓋一個受保護的方法。 C類擴展了A類,D類擴展了C類。在D類內部,我嘗試覆蓋的方法也在此處擴展,該方法稱為parent :: mymethodimoverriding。 該方法在C類中不存在,因此將在A類中進行處理。那是我在B類中覆蓋的方法,顯然您不能用B擴展A並將那些更改顯示在D中,因為它不會掉落與類層次結構一致。 我可能錯了,所以請糾正我。

因此,如果我的類b被調用並運行,則類D被調用,它將運行A中的方法並覆蓋我設置的內容。 我認為必須有一種方法可以使它正常工作,我只是想念一些東西。

這是一個示例,正如您在A類中看到的那樣,有一個對setTitle的調用,它被設置為“ Example”。在我的類中,我將其設置為“ NewExample”。 我的班級在班級D之前被調用,因此當班級D被調用時,它返回到父級,並將標題設置回“ Example”。 我想發生的是B類運行並將其設置為執行D類運行所需的操作,而不是運行該類,而是將其擴展為運行我的類。 問題是我不認為我可以讓D類擴展我的課程。 所以現在它達到了我要擴展的課程

class A{
  protected function _thefunction(){
    setTitle("Example");
  }
}

class B extends A{
  protected function _thefunction(){
    My new code here
    setTitle("NewExample");
  }
}

class C extends A{
  nothing that matters in here for what I am doing
}

class D extends C{
  protected function _thefunction(){
    parent::_thefunction();
    additional code here
  }
}

我試着做

class D extends C{
  protected function _thefunction(){
    B::_thefunction();
    additional code here
  }
}

我有關於它不是靜態方法的錯誤

據我了解,_thefunction()對另一個對象($ headBlock?)有作用。 您的(B)類更改了該對象中的某些內容,然后D類進行了更改,並將其更改回其他內容。 解決此問題的唯一方法是以某種方式禁用D的inreference或在其之后運行類B的方法。

您可以通過C繼承B而不是A來使用繼承,盡管我不知道這些對程序結構可能產生哪些副作用。

編輯:既然我們正在談論這是Magento,也許您應該在SO或Magento論壇中專門詢問Magento。 您幾乎無法覆蓋其中的任何內容; 也許您在方法中的某個地方走錯了路?

那就是我在類B中覆蓋的方法,顯然您不能用B擴展A並將這些更改顯示在D中,因為它不符合類層次結構。 我可能錯了,所以請糾正我。

恐怕你就在這里。 如果您不重新設計整個概念,那么您將無能為力。

我試圖通過使它調用myclass :: thefunction來禁用干擾,但是我當然收到一個錯誤,說明它不是靜態方法。

您可以修改D類嗎? 我不明白這部分。 如果是這樣,我想您根本不會問這個問題。

也許有關Magento的一些細節可能有所幫助? 可能還有其他方法可以達到期望的結果。

您嘗試做的事情可能由於至少兩個原因而無法完成:

  1. 方法_thefunction()在B中受保護,因此僅B及其后代可以訪問。
  2. 您不能為類D的對象調用對象B的方法,因為D既不是B也不是B的后代。

您正在嘗試調用B :: _ theFunciton(),但是B中的方法受到保護(這意味着對該方法的所有訪問都保留給它自己的類或任何子類使用,而D不是,D的類層次結構是... A-> C-> D,那里沒有B。)

該函數也不是靜態的,因此您不能像B :: blah()那樣引用它

如果您確實希望這樣做,則可以將_theFunction定義為公共靜態對象,但是,如果您確實認為這是一個與對象相關的方法,則唯一的好習慣方法是將其作為子類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM