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

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

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

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

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

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

3

Решение

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

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

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

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

0

Другие решения

Других решений пока нет …