Инициализация всех объектов с самого начала, очевидно, плохая идея. Менее очевидно, что использование «нового» в вашем «основном» коде также не является блестящей идеей. Используйте «загрузчик», который предоставляет вам нужные вам объекты (не классы), и избегайте «новых» за пределами загрузчика.
// WRONG
class MainController
{
function action_send_sms() {
require 'lib/sms.php'; // or use autoload
$sms = new MySmsClass();
$sms->send(....)
// RIGHT
class Loader
{
function sms_object() {
require 'lib/sms.php'; // or use autoload
return new MySmsClass();
}
....
class MainController
{
function action_send_sms() {
$sms = $this->loader->sms_object();
$sms->send(....)
// edit: зачем нам это нужно?
Представьте, что в вашем контроллере есть числовые методы, которые используют объект Sms. Если вы используете «новый» и явное имя класса («неправильный» подход выше), 1) вы должны предоставить данные инициализации (например, адрес шлюза sms) для объекта в каждом методе, 2) вы должны редактировать код контроллера изменения имени класса или сигнатуры конструктора и 3) вы не можете временно заменить объект Sms в зависимости от условия (например, «DummySms» для тестирования на вашем локальном компьютере).
С классом Loader все проблемы не проблема, потому что вы пишете весь код инициализации объекта ровно один раз.
(Точнее, этот шаблон называется ServiceLocator, подробнее см. http://martinfowler.com/articles/injection.html).