Основное назначение файла GetInstanceTrait.php в системе Cotonti CMF — это реализация паттерна Singleton с использованием трейта для упрощения создания и управления единственным экземпляром класса.
Суть содержания кода:
- Трейт
GetInstanceTrait позволяет любому классу, который его использует, иметь единственный экземпляр этого класса, обеспечивая создание объекта только один раз.
- Он использует статическое свойство
$classInstances, чтобы хранить экземпляры классов, которые используют этот трейт.
- Метод
getInstance() проверяет, существует ли уже экземпляр текущего класса (используя его имя через static::class). Если экземпляр ещё не создан, он создается и сохраняется в массив $classInstances. В противном случае возвращается уже существующий экземпляр.
Как это работает:
- Класс, который включает в себя этот трейт, может получить единственный экземпляр через метод
getInstance(), гарантируя, что объект будет создан только один раз и его можно будет использовать повторно.
Основное преимущество:
- Упрощает использование паттерна Singleton, позволяя избежать необходимости писать однотипный код для каждого класса, требующего этого паттерна.
находится по адресу: /system/traits/GetInstanceTrait.php
<?php
/**
* @copyright (c) Cotonti Team
* @license https://github.com/Cotonti/Cotonti/blob/master/License.txt
*/
declare(strict_types=1); // Включение строгой типизации для данного файла
namespace cot\traits; // Определение пространства имён для использования трейта
trait GetInstanceTrait // Объявление трейта для реализации паттерна Singleton
{
private static $classInstances = []; // Статическое свойство для хранения экземпляров классов
/**
* @return static
*/
public static function getInstance(): self // Метод для получения экземпляра класса, использующего данный трейт
{
$class = static::class; // Получение имени текущего класса с помощью статической привязки
if (!isset(self::$classInstances[$class])) { // Если экземпляр класса ещё не был создан
self::$classInstances[$class] = new static(); // Создаём новый экземпляр класса
}
return self::$classInstances[$class]; // Возвращаем экземпляр класса
}
}
2 минут чтения Administrator