Требовать метод в родительском классе для вызова в PHP - PullRequest
0 голосов
/ 13 ноября 2009

Как гласит заголовок, я пытаюсь сделать метод в родительском классе обязательным. Хотя, полагаю, это может быть любой класс. Например:

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

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

По сути, я хочу, чтобы foo () требовалась для запуска, или дочерний класс не запускается и возвращает ошибку или перенаправляет на другую страницу. Я мог бы вызвать функцию, но мне интересно, смогу ли я сделать это требованием при расширении родительского класса.

Ответы [ 9 ]

11 голосов
/ 13 ноября 2009

Если вы используете абстрактные классы и методы, вы можете заставить подклассы реализовать отсутствующие методы.

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 голос
/ 13 ноября 2009

Что вам, вероятно, следует сделать, это переопределить 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
    }
}
0 голосов
/ 24 марта 2015

Следующий подход будет только когда-либо жаловаться после того, как вся обработка будет выполнена - однако, если это справедливо для вас, он определенно удостоверится, что 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!");
        }
    }
}
0 голосов
/ 13 ноября 2009

Если вы на самом деле не инициализируете какой-либо код в родительском классе, вам следует использовать интерфейс объекта. Должны быть реализованы методы интерфейса, иначе скрипт выдаст ошибку плода.

Более подробную информацию о них можно найти: http://us3.php.net/interface.

0 голосов
/ 13 ноября 2009

Как уже упоминалось, кажется, что вы хотите, чтобы foo() был абстрактным, заставляя дочерние классы переопределять его.

Любой класс, содержащий абстрактный класс в PHP, требует, чтобы ваш родительский класс тоже был абстрактным. Это означает, что он не может быть создан (создан), а только выведен / субклассирован. Если вы попытаетесь создать экземпляр абстрактного класса, компилятор выдаст фатальную ошибку.

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

См. Код в ответе Питера Бэйли.

0 голосов
/ 13 ноября 2009

Не зависит от других методов. Убедитесь, что они бежали.

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

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

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

}
0 голосов
/ 13 ноября 2009

Пусть ребенок вызовет функцию из родительского элемента в конструкции.

class Child extends Parent
{
   function bar ()
    {
       // do stuff after foo() has ran
    }
    function __construct(){
         parent::foo();
    }
}
0 голосов
/ 13 ноября 2009

Я думаю, что это может быть единственным способом реализации такой функциональности, так как я не думаю, что есть встроенное решение.

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
       }
    }
}
0 голосов
/ 13 ноября 2009

Почему бы просто не установить логическое значение в функции foo (), которая действует как флаг. Проверьте, установлено ли это в дочернем классе / функциях, и все ли у вас в порядке.

...