В чем косяк (полиморфизм)?
В программировании несколько различных видов полиморфизма. Вам следовало уточнить, о каком из них идет речь. Собеседующий с вами конечно же не совсем корректен, так как простейшая форма полиморфизма в вашем примере все же присутствует. Другое дело, что в 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, который говорит, что классы должны быть открыты для расширения, но закрыты для изменений.
return $this->hp = "200 hp";
Конструкция какая-то неизвестная миру.
Почему return везде?
Почему возвращается присваивание?
Ну и логичнее наверно делать unit interface, а не класс.