Я думаю, что этот вопрос больше ориентирован на фанатов языка.
У меня есть следующий класс:
<?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 о том, что вам не следует создавать абстрактные статические методы.