На собеседовании задали вопрос "В чем преимущества и недостатки static методов?"
На что я сказал, что просто я их зачастую не юзаю, и в основном все с кем я сталкивался, говорили избегать их использования. Знаю, что со статикой тяжело тестировать код. Но больше не знаю, в чем их преимущества и недостатки. Может ли кто то объяснить внятно?
У самих статических методов, равно как и у обычных, нет и не может быть никаких преимуществ и недостатков.
Вопрос должен ставиться о целесообразности использования статического метода в той или иной ситуации.
+ ты вызываешь метод не создавая экземпляр класса
- класс должен быть инициализирован* "где то там"** в момент обращения к методу
- тесты со статикой = боль
*инициализация = автолоад, инклуд
**"где то там" = файл в цепочке инклудов
kafkiansky, во-первых, в РНР нет статических классов. Во-вторых, слова «конструктор» и «статика» в одном предложении не кажутся вам странными? Да, может быть некий статический метод, устанавливающий глобальный контекст класс, но он «может», а не «есть».
UPD: так, исходный комментарий отредактирован. Ок. Следуя вашей логике, получается, что создаём инстанс, и в конструкторе инициализируем статические свойства класса, чтобы потом дёргать статические методы?
JhaoDa, я опечатался и сразу исправил свой ответ. нет, мне не кажутся странными, такие подходы можно встретить повсюду, и где гарантии, что этот "класс" инициализирован в момент использования? мое возражение было в пользу того, что статика тоже должна быть инициализирована, если предполагает это, а не против true way.
JhaoDa, автор ответа как раз и указал это в минусах статики. вы удивились, как это среди минусов указана инициализация, а теперь приводите этот самый пример, указывая, что это минус. вы уж определитесь.
kafkiansky, минусом заявлена необходимость инициализации. Я не понимаю, о какой инициализации идёт речь и предположил, что о вот такой. Вот такая инициализация — зло. Но, может, вы про какой-то другой подход к инициализации, хоть и упоминаете постоянно конструктор? Типа:
class Foo
{
private $properties;
public static function init(array $properties): void
{
self::$properties = $properties;
}
public static function getProperty(string $key)
{
return self::$properties[$key] ?? null;
}
}
Foo::init(['a' => 1]);
echo Foo::getProperty('a');