Вызов общественной, статической функции в абстрактном классе

Я предполагаю, что этот вопрос больше ориентирован на язык-geeks. У меня есть следующий класс:

<?php  
abstract class ScopeFactory
{
    public static function doStuff()
    {

    }
}

Теперь я могу вызвать эту функцию, например:

ScopeFactory::doStuff()

И это работает счастливо. Я всегда кодировал под впечатлением, что классы abstract не могут использоваться напрямую - и они должны быть реализованы конкретным классом, чтобы быть вызываемым.

Мое впечатление от static заключается в том, что он не требует, чтобы экземпляр вызывался.

Может кто-нибудь объяснить мне, почему это законно, и если это так? Мне любопытно узнать более тонкие детали.

Ответ 1

Статические методы в ООП не меняют внутреннее состояние, поэтому вы можете вызывать статические методы из абстрактного класса.

Ответ 2

Я был бы удивлен, если бы это было запрещено. Абстрактный класс предполагает, что вы не можете его создать. Поскольку статическим методам не нужен экземпляр класса, вы можете с радостью их использовать.

Глядя глубже, вы можете создать абстрактный статический метод и вызвать его из своего не абстрактного метода:

abstract class ScopeFactory
{
    public static function doStuff()
    {
        static::otherStuff();
    }

    abstract public static function otherStuff();
}

PHP даст вам фатальную ошибку, говорящую, что вы не можете вызвать абстрактный метод. Но также это даст вам предупреждение E_STRICT, в котором вы не должны создавать абстрактные статические методы.