2012-10-06 45 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; 
    } 
} 

这样,您不必修改代码,只需编辑可检索项目的数组。