В чем преимущество $GLOBALS['router']->… перед App::getRouter()->....?
Второй вариант: 1) позволяет в 1 месте заменить роутер на другой, позволяет писать аккуратный код без глобальных переменных, красивее. У первого варианта преимуществ нет.
По поводу расхода памяти — расход памяти у вас будет, если много классов и создается много экземпляров, а если у вас 1 статический класс App, оверхеда почти нет.
Контроллеры-объекты поддерживают наследование, что бывает удобно. Но вообще, хороший фреймворк позволяет написать код вида:
require_once 'framework-bootstrap.php';
if (!App::TableGateway('People')->add(array('name' => 'John', 'surname' => 'Johanson'), $errors)) {
die( «Error»);
} else {
App::templateEngine()->render('success.html');
}
И оставляет автору выбор, использовать объекты или нет.
По поводу PHP-библиотек и фремворков — не смотрите на них. Среди известных библиотек много абсолютно неадекватных вещей, которые портируют к примеру с Явы, не отдавая отчета что цена объекта/класса в PHP/JAva разная, производительность разная, цикл работы разный. В итоге получаются монстры типа Zend или уродливого порта Hibernate.
Я вообще крайне плохо отношусь к Open-source продуктам на PHP, их пишут как попало, бездумно, и не советую брать с них пример, а думать своей головой.
Логгер вам не нужен — пишите либо App::log(string) либо сразу file_put_contents('', '', FILE_APPEND) — все равно эти логи никто читать не будет.