2015-06-30 2 views
1

Мне понравилась идея, представленная в this answer, позволяющая иметь что-то вроде нескольких конструкторов в PHP. Код у меня похож:self :: обращение к производному классу в статических методах родительского класса

class A { 
    protected function __construct(){ 
    // made protected to disallow calling with $aa = new A() 
    // in fact, does nothing 
    }; 

    static public function create(){ 
     $instance = new self(); 
     //... some important code 
     return $instance; 
    } 

    static public function createFromYetAnotherClass(YetAnotherClass $xx){ 
     // ... 
    } 

class B extends A {}; 

$aa = A::create(); 
$bb = B::create(); 

Теперь я хочу, чтобы создать производный класс B, который будет использовать один и тот же «псевдо-конструктор», потому что это тот же самый код. Однако в этом случае, когда я не кодирую метод create(), константа self является классом A, поэтому обе переменные $aa и $bb относятся к классу A, тогда как я хочу $bb быть классом B.

Если я использую $this специальных переменные, это, конечно, будет класс B, даже в A объеме, если я называю любой родительский метод из B.

Я знаю, что могу скопировать весь метод create() (возможно, черты помогают?), Но мне также нужно скопировать все «конструкторы» (все методы create*), и это глупо.

Как я могу помочь $bb стать B, даже если метод вызывается в контексте A?

+1

Вы ищете [Поздние статические привязки] (http://stackoverflow.com/q/1912902/1233508). – DCoder

+1

Возможно, вам нужен 'статический', а не' self'? – bishop

+0

статический или родительский, – ArtisticPhoenix

ответ

2

Вы хотите использовать static, который представляет класс, в котором метод называется. (self представляет класс, в котором способ является определен.)

static public function create(){ 
    $instance = new static(); 
    //... some important code 
    return $instance; 
} 

Обратитесь к документации по Late Static Bindings.

Для этого вам понадобится PHP 5.3+.

Смежные вопросы