动态或固定选项?

时间:2012-10-06 06:33:22

标签: php oop class security

我想知道什么方法被认为是最佳实践,为什么?

拥有该功能,因此它会尝试抓取传入的内容。

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

2 个答案:

答案 0 :(得分:1)

当然,代码需要知道从对象中推断出什么是动态并不是更好,特定的是编写代码并不邋。这意味着你已经用你的大脑来思考这一行动的后果。

答案 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;
    }
}

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