Я пытаюсь использовать шаблон расширения в 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()
Любые подсказки, что я делаю неправильно?
Внедрить 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";
}
}
Чтобы вызвать self::getTable()
, getTable должен быть статическим методом BaseClass
, потому что self
всегда связан с классом, где определяется текущий метод.
Если вы хотите вызвать статический метод текущего класса, вместо этого используйте static::getTable()
. Это называется поздним статическим связыванием, то есть static
привязывается к классу во время выполнения.
Кроме того, измените function getTable()
на static function getTable()
, иначе вы получите ошибку (в зависимости от вашей версии PHP и строгости ошибки)
abstract
перед функцией вExtendedClassA