0

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

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

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

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

4

9 回答 9

11

If you leverage abstract classes and methods, you can force subclasses to implement the missing methods.

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

  abstract protected function bar();
}

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

Subclasses that don't implement bar() will generate a fatal error.

于 2009-11-13T15:30:20.023 回答
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
    }
}
于 2009-11-13T15:29:42.973 回答
0

为什么不在函数 foo() 中设置一个布尔值作为标志。检查它是否已在子类/函数中设置,并且一切就绪。

于 2009-11-13T15:28:21.690 回答
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
       }
    }
}
于 2009-11-13T15:28:43.953 回答
0

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

class Child extends Parent
{
   function bar ()
    {
       // do stuff after foo() has ran
    }
    function __construct(){
         parent::foo();
    }
}
于 2009-11-13T15:28:58.663 回答
0

如前所述,听起来您想要foo()抽象,强制子类覆盖它。

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

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

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

于 2009-11-13T15:36:42.147 回答
0

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

有关它们的更多信息,请访问: http: //us3.php.net/interface

于 2009-11-13T15:40:21.277 回答
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!");
        }
    }
}
于 2015-03-24T16:51:36.067 回答
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();
   }

}
于 2009-11-13T15:32:56.633 回答