в PHP, когда я должен использовать статические методы против абстрактных классов? - PullRequest
9 голосов
/ 08 октября 2009

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

Ответы [ 2 ]

6 голосов
/ 08 октября 2009

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

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

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

private function __construct() {}

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

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

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

final class foo { }

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

final private function __construct() {}
3 голосов
/ 08 октября 2009

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

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

...