2016-05-17 92 views
3

我有一個充當基類的類。然後我有幾個其他類從它繼承。我想用靜態語法開始加載繼承的類,但行爲沒有多大意義。關於繼承類的PHP新self()創建基類對象

直到現在我加載了這樣的類,它完成了這項工作。

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

我希望能夠像這樣調用ByID函數。

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

上述代碼正在工作,但它沒有調用繼承類,它正在加載基類。我想我可以看到爲什麼會發生這種情況,但它沒有任何意義。在.NET中,「this」將始終適用於繼承的對象,但它不是以這種方式在我這裏工作。

我有一個基類欄用以下方法。這在繼承的類中不會被覆蓋。事實上,繼承的類只包含1個單一屬性。

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/"; 
} 

遇到的問題IM是,當我在一個靜態的方式加載類,自()被返回的基類的對象,而不是繼承的類。我需要繼承的類的$directory屬性。繼承的類當然會包含額外的功能和其他的東西,但現在這是阻止我實現這樣的代碼的障礙。任何想法我做錯了什麼?

我不想在每個繼承的類中重寫Get()。有了laravel,我可以記住模型類具有類似的結構,您可以創建一個模型,其中有一個屬性是表的名稱,並且不管怎樣它都可以正常工作。

+1

[延遲靜態結合](http://php.net/manual/en/language.oop5.late-static-bindings.php) –

+0

和'獲取()'應該被定義爲一個靜態方法('公共靜態函數Get()')如果你正在靜態訪問它(像你一樣) –

回答

3

改爲使用靜態綁定。

public static function Get() { 
    return new static(); 
}