Я уже читал Почему 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);
Мое единственное решение, уродливое, состоит в том, чтобы внедрить в базовый класс фиктивный защищенный статический метод и выдать универсальное исключение, так что оно должно быть реализовано наследованием.
Вы можете добавить статическую фабрику, которая будет заполнять контекст для случайных объектов.
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 {...}
Других решений пока нет …