После того, как я попробовал много разных техник, я нашел этот метод функциональным и надежным:
Используйте файл начальной загрузки или файл инициализации. Он находится в корне сайта с соответствующим разрешением и защитой от прямого доступа.
Все страницы сайта сначала включают этот файл. В нем я создаю все свои глобальные объекты (настройки, пользователь) и на них ссылаюсь.
Например:
// OBJECT CREATION
$Config = new Configuration();
$User = new User();
Тогда внутри классов, которым требуются эти объекты:
public function __construct($id = NULL) {
global $Config; // DEPENDENCY INJECTION SOUNDS LIKE AN ADDICTION!
if($Config->allow_something) {
$this->can_do_something = true;
}
if(NULL !== $id) {
$this->load_record($id);
}
}
Обратите внимание, что я просто обращаюсь к этим глобальным объектам внутри класса и что мне не нужно каждый раз включать переменные объекта в качестве первого параметра конструктора. Это стареет.
Кроме того, наличие статического класса Database было очень полезно. У меня нет объектов, о которых мне нужно беспокоиться, я могу просто позвонить $row = DB::select_row($sql_statement);
; проверьте класс PhpConsole.
UPDATE
Спасибо за отзыв, кто бы это ни сделал. Это привлекло внимание к тому факту, что мой ответ - это не то, чем я горжусь. Хотя это может помочь ОП выполнить то, что они хотели, это НЕ хорошая практика.
Передача объектов новым конструкторам объектов - это хорошая практика (внедрение зависимостей), и хотя она «неудобна», как и другие вещи в жизни, дополнительные усилия того стоят.
Единственная искупительная часть моего ответа - это использование шаблона фасада (например, DB :: select_row ()). Это не обязательно одиночный код (то, чего ОП хотел избежать), и он дает вам возможность представить упрощенный интерфейс.
Laravel - это современная среда PHP, которая использует внедрение зависимостей и фасады, среди других проверенных шаблонов проектирования. Я предлагаю любому начинающему разработчику тщательно изучить эти и другие подобные методы проектирования.