Синглтоны - это прославленные глобальные переменные .Шаблон проектирования был создан для языков, в которых глобальные переменные являются трудными или невозможными, или где они считаются плохой практикой.(На самом деле, большинство распространенных шаблонов проектирования предназначены для ограничительных языков. Многие из них просто не нужны в других языках.)
В PHP есть глобальные переменные.Глобальные переменные в PHP обычно являются плохой практикой, но они существуют, если вам нужно их использовать.
Однако есть несколько причин, по которым вы хотите использовать Singleton в PHP.
Синглтоныполезно, когда вызов getInstance
(каноническое имя для метода, возвращающего единственный экземпляр Singleton) может быть сделан в любой точке сценария.До этого момента объект не должен существовать.Если бы объект был глобальной переменной, то он либо должен был бы существовать, либо код, пытающийся ссылаться на объект, сначала должен был бы создать его экземпляр.Фактически, где бы он ни использовался, его нужно было бы правильно создать.Централизовав создание отдельного объекта в getInstance
, вы избавляетесь от необходимости создавать шаблон-копию для копирования и вставки каждый раз, когда вам нужно обратиться к объекту.
Объекты базы данных обычно создаютсяв самом начале срока действия запроса, так что конкретное преимущество Singleton-ness будет потрачено впустую.
Существуют и другие альтернативы Singleton, которые могут выполнить работу другими способами.Одним из примеров является внедрение зависимости , причудливый термин для передачи внешних объектов, от которых будет зависеть новый объект (например, дескриптор базы данных), во время создания.Однако это может быть сложным или раздражающим.Правильное выполнение может включать внедрение лота одних и тех же объектов каждый раз.
Другой альтернативой является шаблон реестра , который фактически является контейнером для вещей, которые могли быиначе будьте глобальными.Если вам не нравятся глобальные переменные, но вы не против их эффективного пространства имен, это будет решение, которое вам понравится.
В конце выберите один из способов сделать это и придерживайтесьэто один путь по всей вашей кодовой базе.Лично я фанат того, что объект базы данных является глобальным.