Почему нельзя вызывать абстрактные функции из абстрактных классов в PHP?
У меня есть абстрактный родительский класс и конкретный класс, который его расширяет. Почему родительский класс не может вызвать абстрактный метод?
//foo.php
<?php
abstract class AbstractFoo{
abstract public static function foo();
public static function getFoo(){
return self::foo(); // строка 5
}
}
class ConcreteFoo extends AbstractFoo{
public static function foo(){
return "bar";
}
}
echo ConcreteFoo::getFoo();
?>
Ошибка:
Fatal error: Cannot call abstract method AbstractFoo::foo() in foo.php on line 5
В чем причина данной ошибки и как ее можно исправить?
2 ответ(ов)
Вы заметили слово self
?
Оно указывает на AbstractClass
. Таким образом, вызывается метод AbstractClass::foo()
, а не ConcreteClass::foo()
.
Я полагаю, что PHP 5.3 предоставит поздние статические связывания (late static bindings), но если вы используете более раннюю версию, то self
будет относиться не к подклассу, а к классу, в котором расположен метод.
Смотрите: http://us.php.net/manual/ru/function.get-called-class.php
В Java действительно существует правило, согласно которому нельзя одновременно использовать ключевые слова abstract
и static
для метода.
Метод с ключевым словом abstract
указывает на то, что подкласс должен реализовать этот метод. В то время как добавление static
к методу позволяет вызывать его без создания экземпляра класса.
Поэтому возникает ошибка.
Разница между public, private и protected в ООП
Добавление метода к существующему экземпляру объекта в Python
Новый self против нового static
Как должна быть структурирована модель в MVC? [закрыто]
Java: статическое поле в абстрактном классе