Я хочу отключить класс, который будет создан оператором new
, но позволяет предположить, что метод getObject
создает и возвращает экземпляр его. Это выполнимо?запретить создание экземпляра класса отдельно, разрешено с завода
ответ
class C
{
protected function __construct()
{
}
public static function getObject()
{
return new self();
}
}
UPDATE:
Код выше выполняет требование: класс не может быть создан с помощью new
, нужно использовать фабричный метод getObject()
для создания объекта. Однако ОП не указала причину, по которой им нужна такая конструкция.
Существует несколько причин возникновения такой конструкции; одним из них является создание объектов типа C
с некоторой инициализацией, которая по какой-либо причине не может быть выполнена в конструкторе класса.
Другой причиной такого способа строительства объектов класса C
является шаблон проектирования Singleton
; который на самом деле является «анти-шаблоном», но это еще одна дискуссия; в целях реализации Singleton, класс C
должен выглядеть следующим образом:
class C
{
private static $instance = NULL;
protected function __construct()
{
}
public static function getObject()
{
if (! isset(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
}
Singleton
или нет, потому что метод getObject()
статична он не может быть погасил или осмеянным рамки испытаний и ее первоначальной реализации должны быть использованы. Более того, поскольку это единственный способ создать объекты класса C
, другие классы, которые используют этот класс, не могут быть протестированы изолированно.
В целом, даже конструкция возможна, не рекомендуется. Обеспечение создания объектов класса C
с использованием языковых механизмов сделало класс неудобным для тестирования других классов, которые его используют.
Если создание объектов класса C
должно выполняться определенным способом из-за его сложной инициализации, лучшим способом является использование шаблона проектирования Builder
. Сделайте его нестационарным методом другого класса («строитель») и попросите программистов (используя документацию по классу) не создавать объекты класса C
напрямую, используя new
. Таким образом, это не влияет на тестируемость других классов.
Я хочу, чтобы отключить класс быть instantized от
new
оператора
Общий подход приватизировать конструктор.
class Example {
private function __construct() {
}
}
Следующие могут привести к фатальной ошибке.
$object = new Example();
В то время как это будет работать, я призываю вас, и будущие читатели, обзор Design Patterns in PHP.
В вашем ответе отсутствует заводской метод. Я понимаю, что @ aciac отвечает 'getObject' –
@Paul Sasik. Мой ответ намеренно касается только первой части вопроса, чтобы побудить будущих читателей больше узнать о последствиях этого шаблона. –
- 1. Создание экземпляра класса с()
- 2. Создание экземпляра класса шаблона по умолчанию в MSVC12 не разрешено?
- 3. Создание экземпляра класса в его статическом конструкторе - почему это разрешено?
- 4. Можете ли вы запретить локальное создание экземпляра класса?
- 5. Создание экземпляра экземпляра другого класса
- 6. Создание экземпляра класса с параметрами
- 7. Создание экземпляра класса внутри класса
- 8. создание экземпляра класса
- 9. Создание экземпляра класса Dart
- 10. Python: создание экземпляра класса
- 11. Создание экземпляра класса внутри класса
- 12. Ограничить создание экземпляра класса?
- 13. Создание экземпляра класса - Python
- 14. Создание экземпляра класса
- 15. Создание класса экземпляра Swift_Mail
- 16. Динамическое создание экземпляра класса
- 17. Создание экземпляра класса Num
- 18. Создание экземпляра для класса?
- 19. Создание экземпляра производного класса с использованием экземпляра базового класса
- 20. Запретить методы вызова экземпляра экземпляра
- 21. Почему для экземпляра родительского класса допускается создание экземпляра родительского класса с помощью конструктора дочернего класса?
- 22. Создание экземпляра из экземпляра класса в PHP?
- 23. Создание экземпляра из имени класса
- 24. Создание экземпляра внутри самого класса
- 25. Создание экземпляра класса внутри EJB
- 26. Создание экземпляра класса без «нового»
- 27. Создание экземпляра класса Возвращает предупреждение?
- 28. Создание экземпляра экземпляра экземпляра в Spockframework
- 29. Создание экземпляра класса динамически C#
- 30. Создание экземпляра класса Util весной
Обратите внимание, что это возвращает новый объект 'C' при каждом вызове' getObject() ', который может быть не предназначен для всех читателей. –
В вопросе нет ограничений на одноэлементное ограничение.Он просто говорит, чтобы запретить создание с использованием 'new' и обеспечить использование фабричного метода. – axiac
Конечно. Я признаю, что дьявол в деталях. Моя забота о будущих читателях, так как этот вопрос, казалось бы, прост, является скользким склоном. –