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 убрал поддержку насмешливых статических методов).