Синглтон-класс и использование наследования - PullRequest
1 голос
/ 08 марта 2010

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

Иногда мне нужны эти классы в нескольких местах моего приложения. То, как я делаю это сейчас, - это создание нового объекта. Я не могу передать переменную, это будет слишком много работы.

Мне было интересно использовать синглтон-классы для этого. Таким образом, я уверен, что одновременно работает только один экземпляр.

Однако мой вопрос: когда я использую этот шаблон, если я сделаю одноэлементный класс для всех объектов, это приведет к большой репликации кода.

Могу ли я вместо этого создать суперкласс superHelper, который является одноэлементным классом, а затем позволить каждому помощнику расширять его.

Будет ли такая установка работать или есть другая альтернатива?

И если это сработает, есть ли у кого-нибудь предложения о том, как кодировать такой класс superHelper.

Спасибо, ребята

Ответы [ 4 ]

0 голосов
/ 29 апреля 2013

Вы не можете расширить класс синглтона. Помните, в одноэлементном классе мы делаем конструктор закрытым, поэтому, если конструктор является закрытым, как вы можете расширить этот класс? Мы все знаем, что мы создаем объект класса, который мы называем его конструктором, и в конструкторе дочернего класса он неявно называется родительским конструктором. Таким образом, в этом случае частный конструктор не может быть вызван в дочернем классе.

0 голосов
/ 08 марта 2010

Я не могу передать переменную, это будет слишком много работы.

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

Тем не менее, вы можете по-разному использовать общую функциональность в php. Самое простое - использовать глобальную функцию. Например. функция, которая не принадлежит ни одному классу. Другой вариант - использовать метод статического класса. Эти два очень похожи; за исключением их синтаксиса, они по существу имеют те же свойства. Немного более слабое связанное решение состоит в том, чтобы поместить функциональность как метод в (абстрактный) базовый класс, из которого расширяется ваш конкретный класс. Это разделяет функциональность между всеми дочерними классами.

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

Если вы хотите более слабосвязанное приложение, вы можете попытаться заменить жесткую зависимость переменной, чтобы получить уровень косвенности. Самое простое - создать объект и сделать его глобальным для всего приложения. Есть несколько способов сделать это в PHP, например, синглтон или просто переменная в глобальной области видимости (доступ к ней можно получить с помощью ключевого слова global или с помощью массива $GLOBALS).

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

Единственный способ избежать опасности глобальных переменных - использовать вместо этого локальные переменные. Например. Чтобы передать зависимости вокруг. Это может быть немного хлопотно, но по моему опыту, это часто не такая большая проблема, как кажется. По крайней мере, выгоды часто перевешивают проблемы. Тем не менее, есть методы, чтобы облегчить боль; В частности, контейнеры для инъекций для зависимостей, которые являются автоматическими фабриками, которые позаботятся о всей проводке для вас. Они имеют свой уровень сложности, но для больших приложений они, безусловно, могут быть хорошим решением.

0 голосов
/ 08 марта 2010

Посмотрите на фабричный шаблон и внедрение зависимостей.

http://www.potstuck.com/2009/01/08/php-dependency-injection/

0 голосов
/ 08 марта 2010

Хотя иногда это необходимо, синглтоны - это зло (потому что это глобальное состояние). Старайтесь избегать их, если вы можете помочь.

РЕДАКТИРОВАТЬ: Если вы не можете избежать одиночных, по крайней мере параметризовать ссылку на это состояние. Другими словами, в классе передайте синглтон его конструктору или тем методам, которые используют синглтон.

Простое создание ссылок на всю вашу кодовую базу на ваш синглтон поставит под угрозу вашу способность тестировать классы изолированно.

Если ваш синглтон с состоянием, ваши тесты внезапно станут с состоянием, и ваши тесты могут начать "каскадный сбой", потому что их предварительные условия повреждаются при сбое предыдущих тестов.

...