2011-11-16 80 views
1

以下是我編寫的一些代碼的摘錄,該代碼基於來自同一類的方法分配$user->privilege。這似乎過分重複,我想知道是否有什麼我可以做的,使其更具可讀性 - 因爲我沒有看到這種重複,我看過的代碼太多。在PHP中調用的重複性類(方法/屬性)

$user -> privileges = $user -> get_privileges ($user -> username); 
+3

爲什麼你會存儲已經可以訪問的函數的結果?你打開自己的不一致!另外,考慮將'$ user-> username'設置爲'get_privileges()'的默認參數,以便您可以忽略它。 – Brad

+0

是的,我更喜歡那個想法。 –

回答

2

它對我來說看起來並不是特別重複,但是根據類之外的方法分配對象的屬性有點不尋常。相反,這可能是更好的對象的構造函數裏面處理,省去了你記住編碼時,設置該屬性:

class User { 
    public $username; 
    public $privileges; 

    public function __construct() { 
     // setup the user however that's done... 

     // And assign privileges in the constructor 
     $this->privileges = $this->get_privileges(); 
    } 

    // In get_privilegs, rather than passing the username property, 
    // just access it via $this->username. 
    // Unless you need to use this method from time to time outside the class, it can be private 
    private function get_privileges() { 
     // Get privs for $this->username 
    } 
} 

而且爲$this->privileges = $this->get_privileges();替代稱爲構造函數中,你可能只是設置$this->privilegesget_privileges()方法。然後,您可以在構造函數中將其稱爲$this->get_privileges(),不需要進行分配。無論哪種方式工作。

+0

作爲面向對象的新手,構造函數有時仍然讓我陷入循環。感謝您的幫助:) –

+0

@DươngVăn您可以在對象構造函數中做很多有用的工作。 –

+0

第二種方法似乎會更好,因爲它從$ __ COOKIES中提取值,這看起來不適用於構造函數。 –

0

我使用這個模式很多時候的方法是昂貴的,我可以將結果只存儲的請求的其餘部分:

class User { 
    protected $_privileges = null; 

    public function getPrivileges() { 
     if ($this->_privileges == null) { 
      // code to populate privileges array 
      $this->_privileges = $privileges; 
     } 

     return $this->_privileges; 
    } 
} 

這樣getPrivileges()只會做的辛勤工作一次,之後它使用自己的本地緩存副本來處理該對象實例的其餘請求。