2016-05-17 5 views
3

私は基本クラスとして動作しているクラスを持っています。私はそれから継承するいくつかの他のクラスを持っています。私は、静的な構文を使用して継承されたクラスの読み込みを開始したいが、その動作はあまり意味をなさない。PHPが継承したクラスの新しいself()が基本クラスオブジェクトを作成しています

これまでのように、私はクラスをロードし、それは仕事をしました。

$obj = new foo(); 
$something = $obj->ByID(1); 

このようなByID関​​数を呼び出せます。

$something = foo::Get()->ByID(1); 

上記のコードは機能していますが、継承されたクラスを呼び出すのではなく、基本クラスをロードしています。なぜ私はこれが起こっているのか分かると思うが、それは意味をなさない。 .NETでは、 "this"は継承されたオブジェクトには常に適用されますが、ここでは私のためにこのように動作していません。

私は以下の方法で基本クラスを持っています。これは継承されたクラスでオーバーライドされません。実際に継承されたクラスは1つの単一のプロパティしか含んでいません。問題Imが有する

class bar 
{ 
    public $directory; 
    public function Get() 
    { 
     return new self(); 
    } 

    public function ByID($id) 
    { 
     //get the record from the file by using $directory to find the file. 
    } 
} 

class foo extends bar 
{ 
    public $directory = "/something/"; 
} 

iは静的な方法でクラスをロードするとき、自己()は、基本クラスのオブジェクトではなく継承クラスを返すことです。継承されたクラスの$directoryプロパティが必要です。継承されたクラスにはもちろん、追加の関数やその他のものが含まれていますが、今のところ、このようなコードを実装することを妨げるロードブロッキングです。どのようなアイデアを私は間違っていますか?

すべての継承クラスでGet()をオーバーライドする必要はありません。 laravelを使用すると、テーブルの名前である1つのプロパティを持つモデルを作成でき、何とかすべてうまく動作するモデルを作成できる、同様の構造を持つモデルクラスを思い出すことができます。

+1

[後期静的バインディング(http://php.net/manual/en/language.oop5.late-static-bindings.php) –

+0

と '(GET)'静的メソッドとして定義されなければなりません静的にアクセスしている場合( 'public static function Get()') –

答えて

3

代わりに静的バインディングを使用してください。

public static function Get() { 
    return new static(); 
} 
関連する問題