0

Почему нельзя вызывать абстрактные функции из абстрактных классов в PHP?

7

У меня есть абстрактный родительский класс и конкретный класс, который его расширяет. Почему родительский класс не может вызвать абстрактный метод?

//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 ответ(ов)

0

Вы заметили слово self?

Оно указывает на AbstractClass. Таким образом, вызывается метод AbstractClass::foo(), а не ConcreteClass::foo().

Я полагаю, что PHP 5.3 предоставит поздние статические связывания (late static bindings), но если вы используете более раннюю версию, то self будет относиться не к подклассу, а к классу, в котором расположен метод.

Смотрите: http://us.php.net/manual/ru/function.get-called-class.php

0

В Java действительно существует правило, согласно которому нельзя одновременно использовать ключевые слова abstract и static для метода.

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

Поэтому возникает ошибка.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь