Использование статической функции в расширенном классе в переполнении стека

У меня есть абстрактный класс, который имеет метод, который использует статическую функцию. Эта статическая функция определена в подклассах и отличается для каждого подкласса. Какой подкласс будет использоваться для создания объекта, определяется в скрипте. Смотрите супер упрощенный код ниже:

abstract class fooClass implements iFooClass {
function getBar(){
$bar = self::getSomething();
return $bar;
}
}

interface iFooClass{
static function getSomething();
}

class fooSubClass_A extends fooClass {
static function getSomething() {
//do something;
//return something;
}
}

class fooSubClass_B extends fooClass {
static function getSomething() {
//do something else;
//return something else;
}
}

$foo = New fooSubClass_A;
$bar = $foo->getBar();

Этот код дает мне эту ошибку:

Неустранимая ошибка: невозможно вызвать абстрактный метод iFooClass :: getSomething () в C: \ wamp \ www \ Classes \ fooClass.php в строке 12

Я думал, так как у подклассов есть доступ к методу суперклассов getBar он будет вызван из подкласса и, следовательно, будет иметь доступ к своей статической функции. Очевидно нет. Есть ли способ переделать это, чтобы заставить его работать?

2

Решение

Я думаю, что сначала вы должны реализовать метод «getSomething» из интерфейса «iFooClass» в «fooClass», потому что все функции интерфейса должны быть реализованы в дочернем классе, это основное правило интерфейсов. Только после этого вы можете включить эту функцию в другой метод класса.

Редактировать: Абстрактные классы имеют возможность не реализовывать все методы интерфейса, если они реализованы в его подклассах.

Edit2 Когда вы вызываете метод с ключевым словом Self, он вызывает метод из класса, где «SELF» действительно существует, а не из объекта класса, из которого мы вызываем метод. Вот почему self :: method () следует изменить с помощью static :: method ()

1

Другие решения

Других решений пока нет …