Как создать класс Singleton, используя классы PHP5?
php
oop
design-patterns
singleton
Эндрю Мур
источник
источник
Ответы:
Использовать:
$fact == $fact2;
Но:
Выдает ошибку.
См. Http://php.net/manual/en/language.variables.scope.php#language.variables.scope.static, чтобы понять области действия статических переменных и понять, почему настройка
static $inst = null;
работает.источник
PHP 5.3 позволяет создавать наследуемый класс Singleton через позднюю статическую привязку:
Это решает проблему, заключающуюся в том, что до PHP 5.3 любой класс, который расширил Singleton, производил экземпляр своего родительского класса вместо своего собственного.
Теперь вы можете сделать:
И $ foo будет экземпляром Foobar вместо экземпляра Singleton.
источник
"subclass should own its own static var. check this: echo get_class(Foobar::getInstance());echo get_class(Singleton::getInstance());"
.$instance
проживает в синглтоне, а не подклассе. После создания экземпляра некоторого подкласса getInstance () вернет этот экземпляр для всех подклассов.К сожалению , ответ Inwdr ломается, когда есть несколько подклассов.
Вот правильный наследуемый базовый класс Singleton.
Тестовый код:
источник
Настоящий и Современный способ сделать Singleton Pattern это:
Так что теперь вы можете использовать его как.
Как вы видите, эта реализация гораздо более гибкая.
источник
instance
функции$instance
должны бытьnull
неfalse
Возможно, вам следует добавить закрытый метод __clone (), чтобы запретить клонирование экземпляра.
Если вы не включите этот метод, становится возможным следующее
сейчас
$inst1
! ==$inst2
- они больше не тот же экземпляр.источник
использовать:
откос:
Если вы используете PHP 5.4: trait его опция, поэтому вам не нужно тратить иерархию наследования, чтобы получить шаблон Singleton
и также обратите внимание, что независимо от того, используете ли вы черты или расширяете класс Singleton, один свободный конец заключался в создании синглтона дочерних классов, если вы не добавили следующую строку кода:
в детском классе
неожиданный результат будет:
источник
Этот код может применяться к любому классу, не заботясь о его названии.
источник
Поддерживает несколько объектов с 1 строкой на класс:
Этот метод будет принудительно использовать синглтоны для любого класса, который вам нужен, все, что вам нужно сделать, это добавить 1 метод к классу, который вы хотите сделать синглтоном, и это сделает это за вас.
Это также сохраняет объекты в классе «SingleTonBase», чтобы вы могли отлаживать все ваши объекты, которые вы использовали в вашей системе, повторяя
SingleTonBase
объекты.Создайте файл с именем SingletonBase.php и включите его в корень вашего скрипта!
Код
Затем для любого класса, который вы хотите сделать синглтоном, просто добавьте этот небольшой метод.
Вот небольшой пример:
И вы можете просто добавить эту одноэлементную функцию в любой класс, который у вас есть, и он будет создавать только 1 экземпляр на класс.
ПРИМЕЧАНИЕ: Вы всегда должны делать __construct приватным, чтобы исключить использование new Class (); конкретизации.
источник
источник
Вам не нужно использовать шаблон Singleton, потому что он считается антипаттерном. В принципе, есть много причин, чтобы вообще не реализовывать этот шаблон. Прочитайте это, чтобы начать с: Лучшая практика по одноэлементным классам PHP .
Если, в конце концов, вы все еще думаете, что вам нужно использовать шаблон Singleton, мы могли бы написать класс, который позволит нам получить функциональность Singleton, расширив наш абстрактный класс SingletonClassVendor.
Это то, с чем я пришел, чтобы решить эту проблему.
Пример использования:
Просто чтобы доказать, что все работает как положено:
источник
Вся эта сложность («позднее статическое связывание» ... харумф) для меня просто признак неработающей модели объекта / класса в PHP. Если бы объекты класса были объектами первого класса (см. Python), то «$ _instance» была бы переменной экземпляра класса - членом объекта класса, в отличие от элемента / свойства его экземпляров, а также в отличие от общего его потомками. В мире Smalltalk, это разница между «переменной класса» и «переменной экземпляра класса».
В PHP мне кажется, что нам нужно принять к сведению, что шаблоны являются руководством к написанию кода - возможно, мы можем подумать о шаблоне Singleton, но пытаемся написать код, который наследуется от реального класса «Singleton» выглядит неправильно для PHP (хотя я предположил, что какая-то предприимчивая душа могла бы создать подходящее ключевое слово SVN).
Я буду продолжать просто кодировать каждый синглтон отдельно, используя общий шаблон.
Заметьте, что я абсолютно не в курсе дискуссии о злодеях, жизнь слишком коротка.
источник
Я знаю, что это, вероятно, приведет к ненужной войне пламени, но я могу видеть, как вам может потребоваться более одного подключения к базе данных, поэтому я бы согласился с тем, что синглтон может быть не лучшим решением для этого ... однако, есть другие варианты использования шаблона синглтона, которые я считаю чрезвычайно полезными.
Вот пример: я решил сделать свой собственный MVC и шаблонизатор, потому что хотел что-то действительно легкое. Однако данные, которые я хочу отобразить, содержат много специальных математических символов, таких как ≥ и μ, и что у вас ... Данные хранятся в моей базе данных как фактический символ UTF-8, а не в кодировке, предварительно закодированной в HTML, поскольку мое приложение может доставлять другие форматы, такие как PDF и CSV в дополнение к HTML. Подходящее место для форматирования HTML находится внутри шаблона («вид», если хотите), который отвечает за рендеринг этого раздела страницы (фрагмент). Я хочу преобразовать их в соответствующие им объекты HTML, но функция PHP get_html_translation_table () не супер быстрая. Имеет смысл извлечь данные один раз и сохранить их в виде массива, что сделает их доступными для всех. Вот' Образец, который я собрал, чтобы проверить скорость. Предположительно, это будет работать независимо от того, были ли другие методы, которые вы используете (после получения экземпляра), статическими или нет.
В основном, я видел типичные результаты, такие как это:
Поэтому, хотя я, конечно, не эксперт, я не вижу более удобного и надежного способа уменьшить накладные расходы на медленные вызовы для каких-либо данных, в то же время делая его очень простым (одна строка кода, чтобы сделать то, что вам нужно). Конечно, в моем примере есть только один полезный метод, и поэтому он ничуть не лучше глобальной функции, но как только у вас появятся два метода, вы захотите сгруппировать их, верно? Я далеко от базы?
Кроме того, я предпочитаю примеры, которые на самом деле что-то делают, поскольку иногда трудно визуализировать, когда пример включает в себя такие выражения, как «// сделать что-то полезное здесь», которые я вижу все время при поиске учебников.
В любом случае, я хотел бы получить любые отзывы или комментарии о том, почему использование синглтона для такого типа вещей вредно (или слишком сложно).
источник
Эта статья охватывает тему довольно широко: http://www.phptherightway.com/pages/Design-Patterns.html#singleton
источник
Я написал долгое время назад мысль, чтобы поделиться здесь
источник
Я согласен с первым ответом, но я бы также объявил класс как окончательный, чтобы его нельзя было расширять, поскольку расширение синглтона нарушает шаблон синглтона. Также переменная экземпляра должна быть закрытой, чтобы к ней нельзя было получить прямой доступ. Также сделайте метод __clone закрытым, чтобы вы не могли клонировать одноэлементный объект.
Ниже приведен пример кода.
Пример использования
Что это мешает вам сделать (что нарушит шаблон синглтона)
ТЫ НЕ СМОЖЕШЬ ЭТО СДЕЛАТЬ!
источник
Это должен быть правильный путь Синглтона.
источник
Мне понравился метод @ jose-segura, использующий черты, но мне не нравилось определять статическую переменную для подклассов. Ниже приведено решение, позволяющее избежать этого путем кэширования экземпляров в статической локальной переменной в метод фабрики, индексированный по имени класса:
Использование такое же, как у @ jose-segura, только в статических переменных в подклассах нет необходимости.
источник
Класс базы данных, который проверяет, существует ли какой-либо существующий экземпляр базы данных, он возвратит предыдущий экземпляр.
Ссылка http://www.phptechi.com/php-singleton-design-patterns-example.html
источник
Это пример создания синглтона в классе базы данных.
шаблоны проектирования 1) синглтон
тогда выход -
использовать только один экземпляр, а не создавать 3 экземпляра
источник
Быстрый пример:
Надеюсь помочь.
источник
Вот мой пример, который предоставляет возможность вызывать как $ var = new Singleton (), а также создавать 3 переменные, чтобы проверить, создает ли он новый объект:
источник