2012-01-26 9 views
0

私は抽象スーパークラスを持っています。スーパークラスを参照するときPHPのインスタンス化の継承

abstract class SuperClass{ 

    public static function loadInstanceFromText(){ 

     $instance = new self(); 
     // do some stuff, etc. 
     return $instance; 

    } 

} 

明らかに、そのメソッドを呼び出すことは不可能ですが、私はまた、私はそれが動作するように期待される児童

class ChildClass extends SuperClass{ 

} 

を持っています。スーパーは、ChildClassないインスタンス化しようとしているため、

ChildClass::loadInstanceFromText(); 

しかし、それは動作しません:私は、次の関数を呼び出します。そのための回避策はありますか?そのloadInstanceFromTextは複雑ですが、基本的にすべての継承で同じである必要があるためです。

答えて

2

キーワードselfは、それが宣言されているクラスを表します。したがって、この場合、new self()は新しいSuperClassを作成します。これは抽象的であるため不可能です。

一方、キーワードstaticは、呼び出し元クラスを表します。これは「Late Static Binding」と呼ばれ、バージョン5.3以降でサポートされています。したがって、new static()を使用すると、期待どおりに新しいChildClassが作成されます。

+0

完璧!それはうまくいった! – arik