2015-12-28 1 views
0

Я уже читал Why does PHP 5.2+ disallow abstract static class methods? и How to force an implementation of a protected static function - второй очень похож на мой случай - но я все еще не отвечаю. В принципе, я хочу заверить, что каждый ребенок моего абстрактного класса реализует защищенный статический метод, не реализуя его, поскольку это не имеет смысла и из-за отсутствия в нем ключевой информации. Кроме того, он должен быть статичным (поскольку метод вызывающего объекта является статическим и не имеет контекста) и защищен (поэтому я не могу использовать интерфейс, и я не хочу, чтобы кто-либо вызывал его напрямую), и он будет вызван поздней статической привязкой. Есть идеи?Есть ли способ для абстрактного защищенного статического метода в PHP для последующего наследования?

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

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

Пример очень манекена, очевидно, строительство, мне нужно использовать очень сложный, например, общий код в BaseClass :: Foo содержит некоторые циклы и условия, так что не существует простого способа, чтобы реорганизовать его. –

+0

Кроме того, в большинстве случаев я хотел бы использовать BaseClass :: foo или static equivallent BaseClass :: whoooaaa, ​​чтобы играть с наследованием статическим способом для сокращения;) –

+0

Реальный вопрос: почему в названии Goku вы создаете статическое отношение наследования? Разве нет лучшего способа сделать это? –

ответ

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 {...}