2012-05-02 79 views
1

我想創建一個具有靜態fetchAll方法的抽象Model類。子類需要指定將在fetchAll方法中使用的名稱/位置。但是,我無法弄清楚如何以可從靜態方法和非靜態方法訪問的方式指定protected $_name方法。這是我到目前爲止有:PHP:如何從靜態方法獲取類成員變量?

abstract class Model 
{ 
    protected $_name; 

    public static function fetchAll() 
    { 
     $request = new ApiRequest(); 
     return $request->get($this->_name); 
    } 

    public function save() 
    { 
     $request = new ApiRequest(); 
     return $request->put($this->_name, $this->_data); 
    } 
} 

class Email extends Model 
{ 
    protected $_name = 'zEmailz'; 
} 

回答

2

只是變量聲明爲靜態:

protected static $_name; 

,並用它的selfstatic關鍵詞,這取決於您是否想獲得後期靜態綁定與否:

return $request->get(static::$_name); 
+0

基於他肯定想要遲到靜態綁定的問題。 –

3

你有沒有考慮通過名稱作爲參數傳遞給fetchAll()方法?

class Email extends Model 
{ 
    protected $_name = 'zEmailz'; 

    public function getResults() 
    { 
     $rows = parent::fetchAll($this->$_name); 
    }  
} 

我不建議設置Model::$_name靜態,因爲任何可能的重複可以覆蓋該值,使其難以確保你想要的電流值相匹配。這是混合靜態和實例化成員的許多缺陷之一。

- 更新 -

您可以將對象傳遞到fetchAll通話,排序的(說有點二/三我從來沒有共同混合DI與靜態調用)的依賴注射液:

// Calling code 
$email = new Email(); 

// Do stuff with $email 

$results = Model::fetchAll($email); 

那麼模型類的樣子:

abstract class Model 
{ 
    public static function fetchAll($object) 
    { 
     $request = new ApiRequest(); 
     return $request->get($object->_name); 
    } 
} 

- 更新#2 -

根據您的評論,您正在尋找一種方法從數據庫中檢索行併爲主對象提供水合物,以便您可以通過OO API調用引用當前值。如果我是你,你會看看Doctrine,而不是重新發明輪子。在學說中,他們擁有所謂的「表格」類,它們與模型類直接相關。例如,您將擁有一個EmailTable.php文件,並且在此類中您將添加自定義方法以返回所需的數據集。

如果你仍然想堅持自己這樣做的方式,那麼你可能要到fetchAll方法進入各子類,否則,如果你把它在父類,你會與一個討厭落得開關/外殼塊,用於你想要水合的所有物體。

例(示範只):

class Email extends Model 
{ 
    protected $_name = 'zEmailz'; 

    public static function fetchAll() 
    { 
     // However you pull rows from DB 

     while ($row = get_current_row) { 

      $email = new Email(); 

      $email->setAddress($row['address']); 
      ... 

      $emails[] = $email; 
     } 

     return $emails; 
    } 
} 
+0

我不想從子類中調用'fetchAll'。 – Andrew

+0

更新了備用解決方案。 –

+0

我認爲第一種選擇更正確。 –

1
,如果你想從靜態方法來訪問你的靜態_name變量

使用自:: $ _名

但它不是用靜態方法到是個好主意基類 認識到,這種方法將只處理靜態數據(對所有後代通用)。 所以,如果你想訪問所有的後代名字,你必須添加你的模型名稱的靜態數組,你也可以存儲params,classname或鏈接到你的後代對象。然後,您可以訪問所有後代,或者只需按名稱或按類名選擇一個,或從存儲的參數中選擇其他一些ID。

1

我可能是錯的,但如果模型是抽象類,他們沒有責任知道誰在使用它們。他們只指定從他那裏繼承的所有類,都會有一個fetchall方法,這個方法可以有或沒有實現,但他必須存在。

如果您有一個從Abstract Model Class繼承的實體,應該使用簽名Entity :: fetchall()來調用。

Entity :: fetchall()可以在內部調用parent :: fetchall($ name)或類似的方式,用這種方式,可以分離誰使用誰的責任。