2012-10-06 77 views
0

我想知道哪種方法被認爲是最佳實踐,爲什麼?動態或固定選項?

具有該功能,以便它試圖抓住無論是在通過

class Test{ 

    private $first = 'first'; 
    private $second = 'second'; 

    public function data($what){ 
     return $this->{strtolower($what)}; 
    } 

} 

或具有固定的選項設置:

class Test{ 

    private $first = 'first'; 
    private $second = 'second'; 

    public function data($what){ 
     switch(strtolower($what)){ 
      case 'first': 
       $value = $this->first; 
       break; 
      case 'second': 
       $value = $this->second; 
       break; 
      default: 
       $value = null; 
     } 
     return $value; 
    } 

} 

使用第一個選項意味着我不需要每次向課堂添加新成員時都要修改該函數,但這也意味着我不能再有private類成員。

使用第二個選項意味着我需要在每次添加新成員時更改函數,但這意味着我可以確保不應該讀取任何內容。

第一種方法,如果我想添加額外的處理到特定的成員,我可以只爲這些成員添加if語句。

使用第二種方法,我可以在case語句中進行處理。

回答

1

當然代碼需要知道從對象中推斷出什麼動態並不是更好,因爲具體寫入代碼並不是馬虎。這意味着你已經用你的大腦思考了這一行動的後果。

0

我只想跟第一個一起走,並利用魔術方法__get()

class Test { 

    private $first = 'first'; 
    private $second = 'second'; 

    public function data($what){ 
     return $this->{strtolower($what)}; 
    } 

    public function __get($what){ 
     // This method is called whenever you're trying to access an inaccessible property. 
     return null; 
    } 
} 

$Test = new Test(); 
var_dump($Test->data('first')); // string: 'first' 
var_dump($Test->data('abcde')); // null 

當然,你也可以用其他一些選擇,比如定義一個可以從函數中檢索哪些屬性的數組。然後,在您的data()函數中,只需檢查請求的屬性是否可檢索。否則返回null

class Test { 
    private $first = 'first'; 
    private $second = 'second'; 
    private $retrievable = array('first', 'second'); 

    public function data($what) 
    { 
     if (in_array($what, $this->retrievable)) 
     { 
      return $this->{strtolower($what)}; 
     } 
     return null; 
    } 
} 

這樣,您不必修改代碼,只需編輯可檢索項目的數組。