php – 强制调用父方法

前端之家收集整理的这篇文章主要介绍了php – 强制调用父方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有没有办法(或模式)强制对父方法调用

我有一个像这样的抽象类:

abstract class APrimitive{
   public function validate(){
      //Do some stuff that applies all classes that extend APrimitive
   }
}

然后我有类似于APrimitive“基地”的课程:

class CSophisticated extends APrimitive{

   public function validate(){
       //First call the parent version:
       parent::validate();

       //Then do something more sophisticated here.
   }
}

问题是,如果我们在几个月的时间内回到代码,并用一个validate()方法创建了一些类似于CSfulisticated的类,那么我们可能会忘记调用parent :: validate( ).

请注意,某些CS复杂类可能没有validate()方法,因此将调用父版本.

我知道有可能在某处发表评论,提醒程序员调用parent :: validate(),但是有更好的方法吗?如果没有在validate()方法调用parent :: validate(),那么抛出异常的自动方法也许是很好的.

您可以使用以下方式强制执行该呼叫:
abstract class APrimitive{
   final public function validate(){
      //do the logic in validate
      overrideValidate();
   }
   protected function overrideValidate(){
   }
}

class CSophisticated extends APrimitive{

   protected function overrideValidate(){

   }
}

现在只允许调用验证,这将反过来称为您的覆盖方法.语法可能有点偏离(PHP不是我的选择语言),但原则可以应用于大多数OOP语言.

进一步说明:

abstract class APrimitive{
   public function validate(){
      echo 'APrimitive validate call.';
      overrideValidate();
   }
   protected function overrideValidate(){
   }
}

class CSophisticated extends APrimitive{

   protected function overrideValidate(){
       echo 'CSophisticated call.';
   }
}

CSophisticated foo;
foo.overrideValidate(); //error - overrideValidate is protected
foo.validate(); //

输出

APrimitive validate call.
CSophisticated call.

函数调用基本上做如下:

foo.validate() -> APrimitive.validate() -> ASophisticated.overrideValidate() (or APrimitive.overrideValidate() if it wasn't overriden)

猜你在找的PHP相关文章