В этот вопрос StackOverflow я узнал, что self::
не был осведомлен о наследовании где static::
был (в PHP). Когда дело доходит до определения группы констант внутри класса, если вы хотите переопределить эти константы в подклассе, чтобы изменить «поведение» по умолчанию, становится необходимым использовать static::
так что метод родительского класса, который ссылается на константу, учитывает «переопределение».
Через 2 года после того, как я задал этот оригинальный вопрос, я начал использовать static::
широко, до такой степени, что я редко использую self::
поскольку self::
казалось бы, чтобы ограничить расширяемость класса, который использует константы, где static::
не имеет этого ограничения.
Даже если я не В настоящее время намереваться переопределить константу в дочернем классе, я заканчиваю тем, что использую static::
на всякий случай — так что мне не нужно делать кучу поиска и замены позже, если получится, я захочу расширить класс и переопределить константу.
Однако в чужом коде я редко увидеть любое использование static::
, Кстати, до 2012 года я даже не знал, что он существует. Так почему же это не общая практика static::
в месте self::
как само собой разумеющееся?
Тогда мой вопрос: есть ли очевидные отрицательные стороны использовать static::
для ссылки на классовые константы, в отличие от self::
? Я виноват в использовании здесь грубого анти-паттерна?
На самом деле это зависит только от того, что вам нужно. Если вам нужен доступ к константе класса, в котором вы ее вызываете, используйте self
, Если вам нужна поздняя статическая привязка, используйте static
,
С точки зрения выступлений, self
а также static
довольно эквивалентны.
Также имейте в виду, что экстенсивный использование статического в сочетании для переопределения / наследования не очень хорошая идея.
Для прямого ответа на ваш вопрос я бы всегда предпочел использование static
для целей тестирования (хотя теперь PHPUnit 4 убрал поддержку насмешливых статических методов).
Других решений пока нет …