2012-08-01 17 views
4

當人們處理擴展其他類的類並根據類中的某些設置提供功能時,我會看到兩種不同的實現。將PHP類設置存儲在變量中或從方法返回

  • 變量用於存儲設置。
  • 方法用於返回設置。

使用變量:

class Model { 
     var $fields = array(); 
     function getFields() { 
      return array_keys($this->fields); 
     } 
     function getRules() { 
      return $this->fields; 
     } 
    } 
    class Person extends Model { 
     var $fields = array(
      'name' => array('maxLength'=>10), 
      'email' => array('maxLength'=>50, 'validEmail'=>true), 
     ); 
    } 

使用方法:

class Model { 
     function getFields() {} 
    } 
    class Person extends Model { 
     function getFields() { 
      return array('name','email'); 
     } 
     function getRules() { 
      return array(
       'name' => array('maxLength'=>10), 
       'email' => array('maxLength'=>50, 'validEmail'=>true), 
      ); 
     } 
    } 

兩個例子都達到同樣的效果,我可以做的事情一樣$person->getFields()$person->getRules(),但在方法-example我不喜歡「重複」字段列表,因爲字段實際上都在中定義和$person->getRules(),並且每次通過該方法詢問時都必須計算該數組。另一方面,我不喜歡每個對象都將所有設置存儲在變量中。這似乎是一種資源浪費。所以我只是想知道更好的方法。

我的主要問題是:

  1. 是否有性能理由選擇一種方式比其他? 2)
  2. 是否有OOP邏輯/易於編程/其他原因選擇其中一個 的方式?

回答

1

從一些基準測試 - 時代很相似 - 在exeption雖然

return array('name','email'); 

return array_keys($this->fields); 

運行10,000次操作爲每個方法生產的這些平均值要快得多:

Variable: 
    getFields 0.06s 
    getRules  0.05s 
Method: 
    getFields 0.04s 
    getRules  0.05s 

要回答y我們的第二個問題 - 取決於你的用例 - 如果這些對象中存儲的數據是靜態的,或者它來自另一個數據源/配置文件。

一個跟進問題,爲什麼不使用對象屬性?

class Person extends Model { 
    protected $name 
    protected $email 

    public function getName() { 
     return $this->name; 
    } 

    public function getEmail() { 
     return $this->email; 
    } 

} 
+0

使用屬性包含在「使用變量」選項中時,$ this->字段用於將字段名稱數組作爲鍵值存儲,並將一組規則作爲值存儲。 – preyz 2012-08-01 19:41:33

+0

對不起,我的錯誤,我的意思是使用單個屬性'$ person-> name''$ person-> email' – cloakedninjas 2012-08-02 09:31:58

1

我的意見是選擇你感到舒服的,沒有太多的性能損失或使用任何性能收益。您最好節省數據處理的性能節省工作。

對我來說,我使用對象的屬性,它看起來清楚,當你正在尋找在類,用於存儲這樣的默認屬性,如果你想覆蓋它們,然後用這個漂亮的語法:

array()+array()