Ответ 1
Статические методы в ООП не меняют внутреннее состояние, поэтому вы можете вызывать статические методы из абстрактного класса.
Я предполагаю, что этот вопрос больше ориентирован на язык-geeks. У меня есть следующий класс:
<?php
abstract class ScopeFactory
{
public static function doStuff()
{
}
}
Теперь я могу вызвать эту функцию, например:
ScopeFactory::doStuff()
И это работает счастливо. Я всегда кодировал под впечатлением, что классы abstract
не могут использоваться напрямую - и они должны быть реализованы конкретным классом, чтобы быть вызываемым.
Мое впечатление от static
заключается в том, что он не требует, чтобы экземпляр вызывался.
Может кто-нибудь объяснить мне, почему это законно, и если это так? Мне любопытно узнать более тонкие детали.
Статические методы в ООП не меняют внутреннее состояние, поэтому вы можете вызывать статические методы из абстрактного класса.
Я был бы удивлен, если бы это было запрещено. Абстрактный класс предполагает, что вы не можете его создать. Поскольку статическим методам не нужен экземпляр класса, вы можете с радостью их использовать.
Глядя глубже, вы можете создать абстрактный статический метод и вызвать его из своего не абстрактного метода:
abstract class ScopeFactory
{
public static function doStuff()
{
static::otherStuff();
}
abstract public static function otherStuff();
}
PHP даст вам фатальную ошибку, говорящую, что вы не можете вызвать абстрактный метод. Но также это даст вам предупреждение E_STRICT, в котором вы не должны создавать абстрактные статические методы.