В программировании несколько различных видов полиморфизма. Вам следовало уточнить, о каком из них идет речь. Собеседующий с вами конечно же не совсем корректен, так как простейшая форма полиморфизма в вашем примере все же присутствует. Другое дело, что в php под полиморфизмом обычно понимают полиморфизм подтипов. Выглядит так
interface UnitInterface {
public function setHp();
}
class Warrior implements UnitInterface {
public function setHp() {...}
}
class Medic implements UnitInterface {
public function setHp() {...}
}
class MainProgram {
private $unit;
public function __construct(UnitInterface $unit) {
$this->unit = $unit;
}
public function run() {
return $this->unit->setHp();
}
}
echo (new MainProgram(new Warrior())->run();
Идея в том, что конструктор класса MainProgram ничего не знает о конкретных реализациях ваших юнитов. Он знает только о том, что они должны удовлетворять интерфейсу UnitInterface. В будущем если у вас хорошо спроектирован интерфейс, то вы сможете заменить одну реализацию юнита на другую, не изменяя код внутри MainProgram. Таким образом, вы соблюдаете
принцип открытости/закрытости из SOLID, который говорит, что классы должны быть открыты для расширения, но закрыты для изменений.