Пацаны норм практика?

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

abstract protected function getMode() : string;
abstract protected function getLevelName() : string;
abstract protected function getPlayerLimit() : int;
abstract protected function getItems() : array;
abstract protected function getEffects() : array;

это наоборот работает, реализация во всех дочерних классах

вернее и так и так можно, я уже написал об этом