Расширение в PHP не работает, когда метод в базовом классе пытается вызвать метод, который реализован только в расширенном классе

1

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

class BaseClass {

    function process() {
       $tableName = self::getTable();
       // Do some processing using $tableName returned
    }

}

class ExtendedClassA extends BaseClass {

    function getTable() {
        return "Table_A";
    }
}

Проблема в том, что когда я пытаюсь создать экземпляр ExtendedClassA и вызывать функцию процесса, приведенный выше код генерирует ошибку, и он сказал бы:

PHP Неустранимая ошибка: вызов неопределенного метода BaseClass :: getTableName()

Любые подсказки, что я делаю неправильно?

Теги:

2 ответа

1

Внедрить getTable в BaseClass. Сделайте его пустым или абстрактным. Также используйте $this вместо self.

Вероятно, BaseClass должен быть абстрактным классом, поскольку вы не можете использовать его напрямую:

    abstract class BaseClass {

        function process() {
           $tableName = $this->getTable();
           // Do some processing using $tableName returned
        }

        abstract function getTable();

    }

class ExtendedClassA extends BaseClass {

    function getTable() {
        return "Table_A";
    }
}
  • 0
    Теперь он говорит, что ExtendedClassA содержит 1 абстрактный метод и поэтому должен быть объявлен как абстрактный или реализовать оставшиеся методы
  • 0
    Не используйте abstract перед функцией в ExtendedClassA
Показать ещё 1 комментарий
0

Чтобы вызвать self::getTable(), getTable должен быть статическим методом BaseClass, потому что self всегда связан с классом, где определяется текущий метод.

Если вы хотите вызвать статический метод текущего класса, вместо этого используйте static::getTable(). Это называется поздним статическим связыванием, то есть static привязывается к классу во время выполнения.

Кроме того, измените function getTable() на static function getTable(), иначе вы получите ошибку (в зависимости от вашей версии PHP и строгости ошибки)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню