PHP扩展了一个类方法,该方法从另一个类调用,该类扩展它并使用parent ::方法调用该方法

时间:2010-04-21 21:12:50

标签: php oop

我正在尝试扩展一个类并覆盖其中一个方法。我们调用那个类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
  }
}

我得到的错误不是静态方法

4 个答案:

答案 0 :(得分:2)

从我能理解的_thefunction()对另一个对象($ headBlock?)做了一些事情。你的班级(B)改变了那个对象的东西,然后D级去了,然后把它改回别的东西。解决这个问题的唯一方法是以某种方式禁用D的干扰或让B类的方法在它之后运行。

你可以通过让C继承B而不是A来使用继承,虽然我不知道它们可能对你的程序结构有什么副作用。

编辑:看到这是我们正在谈论的Magento,也许你应该在SO或Magento论坛中专门询问Magento。你无法覆盖它;也许你的方法在某处出现了错误的转折?

答案 1 :(得分:1)

  

这是我在B类中重复的方法,显然你不能用B扩展A并且在D中显示这些更改,因为它不符合类层次结构。我可能错了,请你纠正我。

我担心你就在这里。如果你不重写整个概念,你就无能为力。

  

我尝试通过调用myclass :: thefunction来禁用干扰,但当然我得到一个错误,说它不是静态方法。

你能修改D级吗?我不明白这一部分。如果是这样的话,我认为你首先不会问这个问题。

也许有关Magento的一些细节可能有帮助吗?可能还有其他方法可以达到预期的效果。

答案 2 :(得分:1)

至少有两个原因可能无法完成你想要做的事情:

  1. 方法_thefunction()受B保护,因此只能为B及其后代访问。
  2. 你不能将对象B的方法称为D类对象,因为D既不是B也不是B的后代。

答案 3 :(得分:1)

您正在尝试调用B :: _ theFunciton(),但B中的方法受到保护(意味着对该方法的所有访问都是为其自己的类或任何子类保留的,D不是,D的类层次结构是...... A-> C-> D,其中没有B.)

该函数也不是静态的,所以你不能像B :: blah()

那样引用它

如果您真的想要这个,那么您可以将_theFunction定义为公共静态,但是如果您真的认为这是一个与对象相关的方法,那么唯一好的做法就是成为它的子类。