Вопрос: Правильно ли реализован класc?

Лучший ответ: Пишу свою модель MVC
а код привели контроллера. Да и в целом вы уже на этом этапе проигрываете. Не нужно даже пытаться разбираться с MVC, это конкретная реализация принципа разделения ответственности. Сначала стоит разобраться с принципом, лежащим в основе, а уже потом ковыряться с реализацией.и мне кажется что я делаю что-то не так и хочется его добить
Давайте сначала по мелочам:if ( !defined( 'FILE_COMPILE' ) )
убрать. Если вы собираетесь "конкатенировать PHP" - не делайте этого. Есть opcache.if ( !class_exists ( 'Controller' ) ) {
composer и PSR-4 совместимая автозагрузка классов.class Controller extends UDAPI {
Наследование классов (extends) - плохо (ну опять же в подавляющем большинстве случаев). Наследование типов (implements) - хорошо. Приучайте себя использовать наследование классов как крайнюю меру.
Ну и опять же, что это за UDAPI от которого вы наследуете контроллер? Не выгоднее ли передать его в конструктор контроллера как зависимость?protected $uri;
    protected $params = array();
    protected $request = array();
сделайте отдельный класс Request и инкапсулируйте работу с ним там.$this->uri = filter_input ( INPUT_SERVER, 'REQUEST_URI', FILTER_SANITIZE_URL );
    $this->uri = trim ( $this->uri, '/\\' );
    $this->uri = urldecode ( $this->uri );
    $this->uri = parse_url ( $this->uri, PHP_URL_PATH );
Опять же, это не задача контроллера. Контроллер пусть принимает уже готовый объект запроса.if ( $this->uri == '' )
        $this->redirect ( $this->config->root_uri . $this->default[ 'controller' ] . '/' . $this->default[ 'action' ], true );
Почитайте про мидлвэры, про фронт-контроллеры, про Model-View-Adapter. Последняя схема куда лучше вписывается в модель HTTP сервера.public function ready (  ) {
сделайте отдельный компонент - роутер. Кто-то (например фронт контроллер) должен просить роутер узнать какой контроллер дергать. И потом уже дергать этот контроллер. Не надо пихать все в одну хрень, тем самым вы нарушаете саму идею "разделения ответственности" пытаясь реализовать конкретную реализацию этого принципа.$this->setController ( array_shift ( $this->pattern ) );
$this->setAction ( array_shift ( $this->pattern ) );
Пара слов о состояние. Состояние это сложность. То есть посмотрев на переменную `$this->pattern` мы понятия не имеем что там хранится поскольку с течением времени его значение меняют. Причем зачем меняют - непонятно.
Чем раньше вы поймете что чрезмерная любовь к состоянию убивает в вас хорошего разработчика и возможности писать читабельный поддерживаемый код - тем будет лучше.call_user_func_array ( array ( $controller, $this->action ), $this->request );
На дворе PHP7 между прочим.} else {
            echo '404 error';
          }
раз уж начали - делайте всю обработку ошибок через исключения. Тут вам пригодится как раз фронт контроллеры и прочее.public function isController ( $controller ) {
    if ( is_dir ( SOURCE_DIR . '/controllers/' . $controller . '/' ) ) {
... PSR-4, классы... автозагрузка...public function getModel ( $controller ) {
Для 2006-ого года в целом нормально, но это ж 10 лет назад.

Худший ответ: прочитайте это www.phptherightway.com (русская версия getjump.me/ru-php-the-right-way/)