Ні, не краще. Сама ідея в тому, щоб ініціалізувати тільки ті класси, які потрібні для відображення сторінки і не більше.
Те, що у випадку зміни файлу/бібліотеки доведеться правити всі контроллери - це не дуже залежить від того, що і як буде ініціалізовано, це питання правильного контролю залежностей класів, і на цю тему можна писати цілу книгу. Основний принцип - Dependency Inversion, тобто, наведу простий приклад.
class DB {/* логіка роботи з базою даних */}
class UsersRepository
{
/**
* @var DB
*/
private $db;
function __construct(DB $db)
{
$this->db = $db;
}
function getAll()
{
return $this->db->query("SELECT * FROM `users`");
}
}
Це - пряма залежність. Клас UsersRepository залежить від класу ДБ. Якщо ми хочемо замінити клас ДБ на інший, який не має методу query - цьому коду хана, ми не знаємо, які методи старого класу де і яким чином використовуються. Щоб уникнути цієї проблеми, ми робимо наступну річ:
interface DBInterface
{
function query();
}
class DB implements DBInterface
{
function query()
{
return 'query result';
}
}
class UsersRepository
{
/**
* @var DB
*/
private $db;
function __construct(DBInterface $db)
{
$this->db = $db;
}
function getAll()
{
return $this->db->query("SELECT * FROM `users`");
}
}
Тепер клас UsersRepository не залежить напряму від класу DB, тепер обидва ці класи залежать від інтерфейсу. Цей принцип контроля залежностей називається Dependency Inversion, і він полягає в тому, що модулі вищого рівня (наприклад, UsersRepository) не повинні залежати від модулей нижчого рівня (реалізація підключення до БД), вони обидва повинні залежати від абстракції (тобто, інтерфейсу, який не містить в собі деталей реалізації).
Взагалі, це один з п'яти принципів SOLID. Цей набір - основа будь-якої правильної ОО-Архітектури, тому я б рекомендував ознайомитися, інакше продовжите писати процедурний гамнокод, але тепер з використанням класів