[英]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的一些細節可能有所幫助? 可能還有其他方法可以達到期望的結果。
您嘗試做的事情可能由於至少兩個原因而無法完成:
您正在嘗試調用B :: _ theFunciton(),但是B中的方法受到保護(這意味着對該方法的所有訪問都保留給它自己的類或任何子類使用,而D不是,D的類層次結構是... A-> C-> D,那里沒有B。)
該函數也不是靜態的,因此您不能像B :: blah()那樣引用它
如果您確實希望這樣做,則可以將_theFunction定義為公共靜態對象,但是,如果您確實認為這是一個與對象相關的方法,則唯一的好習慣方法是將其作為子類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.