Как вызов абстрактного класса получает дочернее значение в конструкторе? - PullRequest
1 голос
/ 18 мая 2019

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

Я пытался с абстрактными методами, но это не сработало.

abstract class AbstractClass {
    protected abstract function foo($data);

    public function __construct($param) {
         self::foo($param);
    }
}

class ConcreteClass extends AbstractClass {
    public $propertie;

    protected function foo($data) {
         $this->propertie = $data;
    }
}

$fa = new ConcreteClass('banana');
echo $fa->propertie;

Но это результат:

Неустранимая ошибка PHP: не удается вызвать абстрактный метод AbstractClass :: foo () в папке / folder / File.php в строке 7

1 Ответ

1 голос
/ 18 мая 2019

Вы используете self ::, как правило, статический метод класса, и не вызываете конструктор родительского класса.

Попробуйте это:

abstract class AbstractClass
{
    protected abstract function foo($data);

    public function __construct($param)
    {
        $this->foo($param); // *** use $this, an instance method
    }
}

class ConcreteClass extends AbstractClass
{
    public $propertie;

    public function __construct($param)
    {
        parent::__construct($param); // ** invoke the parent's constructor
    }

    protected function foo($data)
    {
        $this->propertie = $data;
    }
}
...