需要在PHP中调用父类中的方法

时间:2009-11-13 15:23:28

标签: php parent-child

正如标题所述,我正在尝试在父类中创建一个方法。虽然,我想它可以是任何一个班级。例如:

class Parent
   {
      function foo ()
        {
           // do stuff
        }
   }

  class Child extends Parent
    {
       function bar ()
        {
           // do stuff after foo() has ran
        }
    }

基本上,我希望foo()需要运行或者Child类不运行并返回错误或重定向到其他页面。我可以调用该函数,但我想知道在扩展父类时是否可以使它成为一个要求。

9 个答案:

答案 0 :(得分:11)

如果您利用抽象类和方法,则可以强制子类实现缺少的方法。

abstract class ParentClass
{
  public function foo ()
  {
    // do stuff
    $this->bar();
  }

  abstract protected function bar();
}

class Child extends ParentClass
{
  protected function bar()
  {
    // does stuff
  }
}

未实现bar()的子类将产生致命错误。

答案 1 :(得分:1)

您应该做的是覆盖Parent :: foo(),然后在重写方法中调用父方法,如下所示:

class Parent
{
  function foo ()
    {
       // do stuff
    }
}

class Child extends Parent
{
   function foo ()
    {
       if(!parent::foo()) {
            throw new Exception('Foo failed');
       }

       // do child class stuff
    }
}

答案 2 :(得分:0)

为什么不在函数foo()中设置一个充当标志的布尔值。检查它是否已在子类/函数中设置,并且您已完成设置。

答案 3 :(得分:0)

我认为这可能是实现此类功能的唯一方式,因为我认为没有内置的解决方案。

class Parent
{
    public $foo_accessed = FALSE;
    function foo ()
    {
       $this->foo_accessed=TRUE;
       // do stuff
    }
}

class Child extends Parent
{
   function bar ()
    {
       if($this->foo_accessed==TRUE) {
           // do stuff after foo() has ran
       } else {
           // throw an error
       }
    }
}

答案 4 :(得分:0)

让孩子从构造中的父级调用函数。

class Child extends Parent
{
   function bar ()
    {
       // do stuff after foo() has ran
    }
    function __construct(){
         parent::foo();
    }
}

答案 5 :(得分:0)

不要依赖其他方法。确保他们已经跑了。

class Parent
{
    function foo()
   {
       // do stuff
   }
}

class Child extends Parent
{
    private function bar()
   {
       // do child class stuff
   }

   public function doFooBar()
   {
    parent::foo();
    $this->bar();
   }

}

答案 6 :(得分:0)

如前所述,听起来你希望foo()是抽象的,迫使子类覆盖它。

PHP中包含抽象类的任何类都要求您的父类也是抽象的。这意味着它不能被实例化(构造),只能派生/子类。如果您尝试实例化抽象类,编译器将发出致命错误。

http://php.net/manual/en/language.oop5.abstract.php

请参阅Peter Bailey的答案中的代码。

答案 7 :(得分:0)

如果您实际上没有初始化父类中的任何代码,则应使用对象接口。必须实现接口方法,否则脚本会抛出胎儿错误。

可以找到有关它们的更多信息:http://us3.php.net/interface

答案 8 :(得分:0)

以下方法只会在完成所有处理后抱怨 - 但是如果这对您来说是公平的,那么肯定会确保在父类中调用foo()或以其他方式触发您可以采取行动的条件

class DemandingParent { 

    private $hasFooBeenCalled = false;

    public function foo() {
        $this->hasFooBeenCalled = true;

        /* do Stuff */
    }

    public function __destruct() {
        if (!$this->hasFooBeenCalled) {
            throw new Exception("Naughty Child! Call your parent's foo b4 you speak up!");
        }
    }
}