в PHP, когда я должен использовать статические методы по сравнению с абстрактными классами?

Я не полагаю, что существует встроенный механизм. Получение каждого кадра отслеживания стека, позволяя Вам определить метод в трассировке, только дает Вам отраженную информацию о типе о том методе. Никакая информация о параметре. Я думаю, что это то, почему некоторые исключения, особенно, ArgumentException, и. al. обеспечивают механизм для определения значения аргумента, вовлеченного в исключение, так как нет никакого простого способа получить его.

9
задан 7 October 2009 в 20:38
поделиться

2 ответа

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

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

Другие методы включают определение конструктора private

private function __construct() {}

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

function __construct() { throw new Exception('This is a static class'); }

Если вы также не хотите, чтобы класс был подклассом, объявите класс final.

final class foo { }

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

final private function __construct() {}
6
ответ дан 4 December 2019 в 21:50
поделиться

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

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

3
ответ дан 4 December 2019 в 21:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: