static:: vs. self:: - есть ли минусы?

В этом вопросе Stackru я узнал, что self:: не был осведомлен о наследовании где static:: был (в PHP). Когда дело доходит до определения группы констант в классе, если вы хотите переопределить эти константы в подклассе, чтобы изменить "поведение" по умолчанию, становится необходимым использовать static:: так что метод родительского класса, который ссылается на константу, учитывает "переопределение".

Через 2 года после того, как я задал этот оригинальный вопрос, я начал использовать static:: широко, до такой степени, что я редко использую self:: поскольку self:: казалось бы, чтобы ограничить расширяемость класса, который использует константы, где static:: не имеет этого ограничения.

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

Однако в чужом коде я редко вижу какое-либо использование static::, Кстати, до 2012 года я даже не знал, что он существует. Так почему же это не общая практика static:: в месте self:: как само собой разумеющееся?

Мой вопрос: есть ли какие-либо очевидные недостатки в использовании static:: для ссылки на классовые константы, в отличие от self::? Я виноват в использовании здесь грубого анти-паттерна?

1 ответ

На самом деле это зависит только от того, что вам нужно. Если вам нужен доступ к константе класса, в котором вы ее вызываете, используйте self, Если вам нужна поздняя статическая привязка, используйте static,

С точки зрения выступлений, self а также static довольно эквивалентны.

Также имейте в виду, что широкое использование статического в сочетании для переопределения / наследования не является хорошей идеей.

Для прямого ответа на ваш вопрос я бы всегда предпочел использование static для целей тестирования (хотя теперь PHPUnit 4 убрал поддержку насмешливых статических методов).

Другие вопросы по тегам