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 语句中进行处理。

4

2 回答 2

1

当然,代码需要知道从对象中推断出什么 Dynamic 并不是更好,具体化并不草率地编写代码。这意味着你已经用你的大脑思考了那个行动的后果。

于 2012-10-06T06:50:21.970 回答
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;
    }
}

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

于 2012-10-06T06:42:34.910 回答