Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP扩展一个类方法,该类方法从另一个类调用,该类对其进行扩展并使用parent::method调用该方法_Php_Oop - Fatal编程技术网

PHP扩展一个类方法,该类方法从另一个类调用,该类对其进行扩展并使用parent::method调用该方法

PHP扩展一个类方法,该类方法从另一个类调用,该类对其进行扩展并使用parent::method调用该方法,php,oop,Php,Oop,我试图扩展一个类并重写它的一个方法。让我们调用该类A。我的类B正在覆盖一个受保护的方法。类C扩展类A,类D扩展类C。在类D内部,我试图覆盖的方法也在这里扩展,它调用parent::myMethodiOverriding。该方法在类C中不存在,所以它在类A中使用。这是我在类B中过度使用的方法,很明显,您不能用B扩展A,并在D中显示这些更改,因为它不符合类层次结构。我可能错了,请纠正我 因此,如果调用并运行我的类b,那么调用类D,它将运行A中的方法并覆盖我设置的内容。我在想一定有办法让它发挥作用,我

我试图扩展一个类并重写它的一个方法。让我们调用该类A。我的类B正在覆盖一个受保护的方法。类C扩展类A,类D扩展类C。在类D内部,我试图覆盖的方法也在这里扩展,它调用parent::myMethodiOverriding。该方法在类C中不存在,所以它在类A中使用。这是我在类B中过度使用的方法,很明显,您不能用B扩展A,并在D中显示这些更改,因为它不符合类层次结构。我可能错了,请纠正我

因此,如果调用并运行我的类b,那么调用类D,它将运行A中的方法并覆盖我设置的内容。我在想一定有办法让它发挥作用,我只是错过了一些东西

这里有一个例子,正如你在类A中看到的,有一个对setTitle的调用,它被设置为“example”,在我的类中,我将它设置为“NewExample”。我的类在类D之前被调用,所以当类D被调用时,它会返回到父类并将标题设置回“示例”。我希望发生的是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
  }
}

据我所知,函数()对另一个对象($headBlock?)做了一些事情,我发现它不是一个静态方法。您的类(B)更改该对象中的某些内容,然后类D将其更改回其他内容。解决这个问题的唯一方法是以某种方式禁用D的交互引用,或者让B类的方法在它之后运行

您可以通过让C继承B而不是A来使用继承,尽管我不知道这些可能会对程序的结构产生什么副作用


编辑:既然这就是我们正在谈论的Magento,也许你应该在SO或Magento论坛中特别询问Magento。没有什么是你不能忽略的;也许您在方法中的某个地方走错了方向?

据我所知,函数()对另一个对象($headBlock?)做了一些事情。您的类(B)更改该对象中的某些内容,然后类D将其更改回其他内容。解决这个问题的唯一方法是以某种方式禁用D的交互引用,或者让B类的方法在它之后运行

您可以通过让C继承B而不是A来使用继承,尽管我不知道这些可能会对程序的结构产生什么副作用

编辑:既然这就是我们正在谈论的Magento,也许你应该在SO或Magento论坛中特别询问Magento。没有什么是你不能忽略的;也许你在你的方法中走错了方向

这就是我在类B中过度使用的方法,很明显,你不能用B扩展A,让这些更改显示在D中,因为它不符合类层次结构。我可能错了,请纠正我

恐怕你就在这儿。如果你不重新设计整个概念,你就无能为力

我试图通过让它调用myclass::thefunction来禁用干扰,但当然,我在说它不是静态方法时出错了

你能修改D类吗?我不明白这部分。如果是这样,我想你一开始就不会问这个问题了

也许一些关于Magento的细节能帮上忙?可能还有其他方法可以达到预期的结果

这就是我在类B中过度使用的方法,很明显,你不能用B扩展A,让这些更改显示在D中,因为它不符合类层次结构。我可能错了,请纠正我

恐怕你就在这儿。如果你不重新设计整个概念,你就无能为力

我试图通过让它调用myclass::thefunction来禁用干扰,但当然,我在说它不是静态方法时出错了

你能修改D类吗?我不明白这部分。如果是这样,我想你一开始就不会问这个问题了


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

您试图做的事情可能无法完成,原因至少有两个:

  • 方法_thefunction()在B中受保护,因此只能对B及其子体进行访问
  • 不能为类D的对象调用对象B的方法,因为D既不是B也不是B的后代

  • 您试图做的事情可能无法完成,原因至少有两个:

  • 方法_thefunction()在B中受保护,因此只能对B及其子体进行访问
  • 不能为类D的对象调用对象B的方法,因为D既不是B也不是B的后代

  • 您正试图调用B::\u thefanceton(),但B中的方法受到保护(这意味着对该方法的所有访问权都保留给它自己的类或任何子类,而D不是,D的类层次结构是…A->C->D,其中没有B)

    该函数也不是静态的,因此不能像B::blah()那样引用它


    如果你真的想这样做,那么你可以将函数定义为public static,但是如果你真的认为这是一个与对象相关的方法,那么唯一好的实践方法就是从它中创建一个子类。

    你试图调用B::\f函数(),但是B中的方法是受保护的(这意味着对该方法的所有访问权都是为它自己的类或任何子类保留的,而D不是,D的类层次结构是…A->C->D,其中没有B。)

    该函数也不是静态的,因此不能像B::blah()那样引用它

    如果你真的想要这个