Ооп — Есть ли способ абстрактного защищенного статического метода в PHP для последующего наследования?

Я уже читал Почему PHP 5.2+ запрещает методы абстрактного статического класса? а также Как заставить реализацию защищенной статической функции — второе очень похоже на мой случай — но я все еще без ответа. По сути, я хочу заверить, что у каждого потомка моего абстрактного класса есть реализация защищенного статического метода, без его реализации, поскольку это не имеет смысла и из-за отсутствия ключевой информации. Кроме того, он должен быть статическим (потому что метод вызывающего является статическим и не имеет контекста) и защищенным (поэтому я не могу использовать интерфейс, и я не хочу, чтобы кто-то вызывал его напрямую), и он будет вызван поздним статическим связыванием. Есть идеи?

Фиктивный код ниже, чтобы осветить мой случай:

abstract class BaseClass {

public static function foo() {
// some common stuff
static::bar();
// rest of common stuff
}

public function whoooaaa($condition) {
if ($condition) {
AClass::foo();
} else {
BClass::foo();
}
}
}

class AClass extends BaseClass {

protected static function bar() {
// do something
}
}

class BClass extends BaseClass {

protected static function bar() {
// do something else
}
}

// end somewhere else in my code, two constructions, both used:
AClass::foo();
// ....
$baseClassInheritedInstance->whoooaaa($variableCondition);

Мое единственное решение, уродливое, состоит в том, чтобы внедрить в базовый класс фиктивный защищенный статический метод и выдать универсальное исключение, так что оно должно быть реализовано наследованием.

0

Решение

Вы можете добавить статическую фабрику, которая будет заполнять контекст для случайных объектов.

class Factory() {
public static getObject($condition) {
$object = $condition ? new A() : new B();
// you can fill context here and/or use singleton/cache
return $object;
}
}

abstract class Base {
abstract function concreteMethod();
}

class A extends Base {...}
class B extends Base {...}
0

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

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