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

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

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

}
}

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

ScopeFactory::doStuff()

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

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

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

13

Решение

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

9

Другие решения

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

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

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

abstract public static function otherStuff();
}

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

5