2013-10-04 103 views
1

如果我有一個抽象基類,像這樣:PHP - 擴展靜態屬性/子類

<?php 
abstract class Record { 
    static $table; 

    public function getRows() { 
     return getRowsFromTable(static::$table); 
    } 
} 
?> 

我要擴展這個類,像這樣:如果我叫然後

<?php 
class User extends Record { 
    static $table = 'users'; 

    private $name; 
?> 

<?php 
$user = new User; 
$user->getRows(); 
?> 

內部,getRows()調用和返回getRowsFromTable('users')

但如果我創建另一個類,還延伸Record

<?php 
class House extends Record { 
    static $table = 'houses'; 

    private $address; 
?> 

然後就是static $table = 'houses';聲明覆蓋Record::$table,因此,打破了User類。

發生了什麼事情,聲明static $table = 'houses';氣泡達到父級,所以現在Record::$table = 'houses';。由於HouseUser之後聲明,下次我撥打$user->getRows()時,在內部,User引用了父代Record,最終致電getRowsFromTable('houses')而不是getRowsFromTable('users')

我使用晚期靜態綁定,以便從擴展類中獲取屬性;但由於UserHouse擴展了相同的父類,它們都以相同的屬性值結束,儘管它們用不同的值覆蓋它。

如果我是通過創建一個類Record2並具有House延長Record2複製的Record類,我不會有這個問題 - 但不會真正的幫助。

這是錯誤的設置?我應該在這種情況下不使用靜態變量嗎?如果是這樣,我應該如何放置他們的位置?我知道$table不一定必須是靜態的,但還有其他屬性可能需要是靜態的。

+0

'父::'?也許你應該試試 –

+1

我不知道我是否和你在一起'打破用戶課堂' - 你能解釋一下你的問題嗎? –

+1

它可以使用'self ::'而不是'static ::'嗎? –

回答

0

我真的不會爲此使用靜態字符串。

如何這樣的事情...

abstract class Record { 
    /** 
    * @return table name as string 
    */ 
    abstract protected function getTable(); 

    public function getRows() { 
     return getRowsFromTable($this->getTable()); 
    } 
} 

然後,您具體的實現必須實現getTable,如

class User extends Record { 
    protected function getTable() { 
     return 'users'; 
    } 
}