Super-шаблон MFШаблоны MaxSite CMSНТML-курсы бесплатноРеклама на сайтеTelegram-канал
MaxSite.org

Как создать свой сайт

Заказать сайт/блог/лендинг недорого
Дневник Софт PHP CSS, HTML, LESS, SASS PHP/ООП SEO Alpine.js Шаблон MF Тайм-менеджмент jQuery и JavaScript Java и Android CodeIgniter Landing Page Git. GitHub
PHP/ООП
  • Паттерн Singleton в PHP
  • ООП в PHP
  • Композиция и наследование ООП в PHP
  • Шаблоны проектирования для PHP
  • Шаблон «Fluent interface» (Текучий интерфейс)
  • Шаблон проектирования Facade (Фасад)
  • Шаблон Abstract Factory (Абстрактная фабрика) на PHP
  • Шаблон Factory Method (Фабричный метод) на PHP
  • Шаблон Singleton. Трейты (trait) в PHP
  • Шаблон Multiton (Пул одиночек)
  • Шаблон Registry (Реестр)
  • Шаблон Composite (Компоновщик)
  • Шаблон Builder (Строитель)
  • Шаблон Strategy (Стратегия)
  • Шаблон проектирования Adapter (адаптер)
  • Шаблон Observer (Наблюдатель)
  • Шаблон Prototype (Прототип)
  • Шаблон Bridge (Мост)
  • Шаблон Decorator (Декоратор)
  • Шаблон Flyweight (Приспособленец)
  • Шаблон Proxy (Заместитель)
  • Шаблон «Template method» (Шаблонный метод)
  • Dependency injection (внедрение зависимости)

Я готов сделать для вас сайт/лендинг на MaxSite CMS с установкой, настройкой, созданием шаблона, подгонкой дизайна и т.д. У меня большой опыт и множество созданных сайтов, плагинов, шаблонов. Также я выполняю отдельные работы по PHP и HTML5/CSS3-верстке. Могу поучаствовать в вашем стартапе как php-программист. При необходимости переведу ваш сайт с другого «движка» (WP, Wix и т.д.) на MaxSite CMS, чтобы он стал быстро работать.

Принимаю заказы на создание telegram-ботов.

Несколько примеров последних работ:

  • b-reading.ru
  • dailycars.com.ua
  • vcredite.com.ua
  • cq-herson.info
  • eremeev.org
  • booksread.ru
  • beregite-zdorovje.ru
  • regression.pro

Подробнее о моих услугах

Паттерн Singleton в PHP

PHP/ООПООП30 марта 2019 г.

Можно сказать, что Singleton в PHP наиболее часто используемый паттерн. Смысл его работы в том, чтобы гарантировать существование одного единственного экземпляра переменной (класс, массив, не важно) во всём приложении. Зачем это вообще нужно?

Предположим сайт использует работу с базой данных MySQL. Для этого необходимо выполнить процедуру подключения, которая возвращает дескриптор соединения. Дальше с этой базой можно выполнять различные операции. Если у нас php-проект из множества файлов, то нужно сделать так, чтобы дескриптор соединения был доступен в любой части проекта. Если этого не сделать, то при каждом обращении к базе придется заново создавать новое соединение, что не очень хорошо скажется на нагрузке сервера.

Другой пример — единая конфигурация приложения. Скажем те же параметры доступа к базе можно хранить в каком-то одном файле, который один раз считывается и помещается в массив и доступен из любой части программы.

Для решения именно таких задач и используется Singleton.

Считается, что Singleton предназначен только для ООП (объектно ориентированное программирование), но на самом деле это не так. Паттерн легко реализуется и на обычных функциях.

Глобальная область видимости

Самым простым вариантом решения, будет использование глобальной области видимости.

$SI = array();
 
function f1()
{
	global $SI;
	...
}

В некоторых случаях глобальная область видимости, действительно может использоваться, поскольку имеет очень простую и быструю реализацию. Но использование глобальной области видимости считается не самым лучшим вариантом (по разным причинам), поэтому нужно придумать какой-то другой вариант.

Статичные переменные

В PHP существуют статичные переменные, которые имеют область видимости только внутри своей функции, но при этом сохраняют своё значение после выхода из функции. Именно на статичных переменных основываются реализации Singleton.

Рассмотрим начальную задачу — получение только одного экземпляра переменной. Функция простая:

function get_instance()
{
	static $SI = NULL;
	
	if (is_null($SI)) $SI = array();
	
	return $SI;
}

Переменная $SI объявлена статической и инициализируется значением NULL. При первом вызове проверяется условие, и если $SI равна NULL (то есть ни разу не вызывалась), она инициализируется. В нашем примере просто как массив.

При повторных вызовах $SI уже существует и функция отдает её как есть.

$e1 = get_instance();
print_r($e1);

Если $SI будет содержать какие-то неизменные данные, например id подключения к базе данных или файл конфигурации, то данной реализации будет достаточно. Но, часто стоит задача изменить $SI - внести какие-то данные, чтобы потом они стали доступны при последующих вызовах.

Поэтому для решения этой задачи используется обращение по ссылке. В таком варианте мы будем получать не новую копию переменной, а ссылку на существующую.

function &get_instance()
{
	static $SI = NULL;
	
	if (is_null($SI)) $SI = array();
	
	return $SI;
}

Изменения всего лишь в одном символе &. Теперь можно не только получить значение $SI, но и изменять его.

$e1 = &get_instance();
$e1[] = 'first';
 
$e2 = &get_instance();
$e2[] = 'second';
 
$all = get_instance();
print_r($all);
 
Array
(
    [0] => first
    [1] => second
)

Если менять $SI не требуется, то get_instance() можно вызывать и без &, как это сделано для $all.

Реализация на классах

Singleton через PHP-классы реализуется точно по этому же принципу — на статичных переменных и вызовах. Приведу простой практический пример:

class Singleton {
    private static $instance;
	private $var = array();

    public static function get_instance() 
	{
        if (empty(self::$instance)) self::$instance = new self();
		return self::$instance;
    }
	
    public function getVar() 
	{
		return $this->var;
	}
	
    public function setVar($v) 
	{
		$this->var[] = $v;
	}	
}

Переменная $instance также объявлена статичной, которая в методе get_instance проверяется с помощью empty(). Если она пустая, то инициализируется собственным классом.

Методы getVar и setVar и переменная $var приведены как простой пример работы с этим классом:

$SI_1 = Singleton::get_instance();
$SI_1->setVar('first');
 
$SI_2 = Singleton::get_instance();
$SI_2->setVar('second');
 
$SI_3 = Singleton::get_instance();
print_r($SI_3->getVar());
 
Array
(
    [0] => first
    [1] => second
)

Здесь создаются разные переменные, но все они по сути работают с одним объектом Singleton.

В «классической» реализации Singleton нужно ещё добавить запрет на вызов конструктора класса, его клонирование и т.п.

Функция-обёртка

В заключении хочу отметить, что часто, вместо статичного вызова метода класса, используют более простую функцию. Это позволяет немного упростить используемый код, как это например сделано в CodeIgniter.

function &get_instance()
{
	return Singleton::get_instance();
}

Использование примеров выше:

$SI_1 = &get_instance();
$SI_1->setVar('first');
 
$SI_2 = &get_instance();
$SI_2->setVar('second');
 
$SI_3 = &get_instance();
print_r($SI_3->getVar());
 
Array
(
    [0] => first
    [1] => second
)
Для чего нужны javascript-фреймворки
Шаблон MAX Bootes (MF)
twitter.com facebook.com

Другие записи сайта

  • Автозагрузка классов в PHP
  • Как изменить стартовую страницу в Slimjet (Chrome)
  • LESS-компиляция через Node.js и Grunt
  • Антивирусы
  • 4t Tray Minimizer
  • Шаблон Flyweight (Приспособленец)
  • Шаблоны текста-2

Комментариев: 2 RSS

1legos21-08-2020 15:30

Всегда хотел спросить, зачем в приведенном примере get_instance() делать static ?

private static $instance не достаточно, чтобы получать один и тот же экземпляр?

Спасибо.

2MAX21-08-2020 16:13

Без static невозможно будет вызвать метод, не создавая экземпляр объект.

Оставьте комментарий!

Комментарий будет опубликован после проверки. Вы соглашаетесь с правилами сайта.

(обязательно)

MaxSite.org
Блог о том, как создавать сайты

Услуги по созданию сайтов, блогов, лендингов
Обратная связь • Реклама на сайте
Мои проекты
  • MaxSite CMS
  • Super-шаблон MF
  • Шаблоны MaxSite CMS
  • Berry CSS (CSS Utilities)
  • Albireo Framework
  • UniCSS (Universal Atomic CSS)
  • Landing Page Framework
  • Бесплатные НТML-курсы
Ссылки
  • Telegram-канал
  • Github
  • Twitter
  • Telegram-бот
  • RSS
© MaxSite.org, 2006-2021. Работает на MaxSite CMS / Время: 0.3043 / SQL: 25 / Память: 1.37MB / Вход