В примере ниже, метод makeInterviewer(): Interviewer возвращает тип интерфейса Interviewer.
Этот метод ничего не возвращает, а только объявляет требования к наследникам - они должны реализовать этот абстрактный метод и уже вернуть конкретный объект, реализующий интерфейс Interviewer.
Соответственно, никакой магии тут нет, просто в вашем примере не хватает классов-наследников с конкретной реализацией.
interface Interviewer {
public function askQuestions();
}
abstract class HiringManager {
abstract public function makeInterviewer(): Interviewer;
public function takeInterview() {
$interviewer = $this->makeInterviewer();
$interviewer->askQuestions();
}
}
class TeamLead implements Interviewer {
public function askQuestions() {
...
}
}
class Boss extends HiringManager {
public function makeInterviewer(): Interviewer {
return new TeamLead();
}
}
https://www.php.net/manual/ru/language.oop5.abstra...