在PHP OOP中获取/设置属性的最佳方法是什么

时间:2016-06-17 03:34:51

标签: php oop

我观看过的许多有关PHP OOP的教程都使用getter和setter方法来设置invidivual属性并从对象中检索数据。但是我想知道在数组中传递所有属性的第二种方法是否可以,如果没有,为什么?

$obj = new MyClass();

选项1:Setter&吸气剂

$obj->setKeyword("orange");
$obj->setTitle("Title Name");
$obj->setPage(4);
$obj->setContent("Blah blah blah");
$obj->setTemplate("template.tpl");

$disp = $obj->getContent();

选项2:数组&吸气剂

$params = array('keyword' => "orange",
                'title' => "Title Name",
                'page' => 4,
                'content' => "Blah blah blah",
                'template' => "template.tpl"
        );

$obj->setParams($params);
$disp = $obj->getContent();

我倾向于选择2我写的脚本,因为有大约二十多个属性可以为对象设置,我觉得可能只是将它们全部发送到一个数组中最简单的方法。我也不需要为每个属性创建一个get和set方法,我认为这会减少我需要为类创建的代码量。

选项2有什么问题吗?使用选项1中所示的getter和setter方法更好吗?谢谢!

3 个答案:

答案 0 :(得分:5)

你的第二种方法没有错。

我认为两者都必须可用。

我所知道的几乎每个集合实现都提供至少一种质量分配方法。

答案 1 :(得分:1)

个人获取和设置使您有机会在进出方式中操纵数据,或运行其他类型的逻辑。这通常是我是否拥有它们的驱动因素。如果对象纯粹是存储没有质量集的错误,但也要考虑未来的可能性......当有人来快速修复并做类似的事情时,我已经看到这些事情堕落:

public function setParams($params){
    $params['x']=$params['x']*2;
    etc...
}

答案 2 :(得分:0)

任何一个都没有错。两者都很好。只是取决于你喜欢如何实现它。但是,如果您喜欢第一种方法,并且不想为每个属性编写新方法。那么,如果属性的数量大到两十个,那么您不需要为每个属性编写一个方法。相反,你可以使用__get()& __set()魔术方法。像这样:

class MyClass
{
    private $publicProperties = ['abc'=>NULL,,'xyz'=>NULL]; //add all properties you want to be accessible. with their default values.

    public function __get($name)
    {
       if(array_key_exists($name, $this->publicProperties))
            return $this->publicProperties[$name];
        throw new Exception('properties Does Not Exist.');
    }

    public function __set($name, $value)
    {
        if(array_key_exists($name))
        {
            $this->publicProperties[$name] = $value;
            return true;
        }
        throw new Exception('Proeperty Does Not Exist.');

    }
}

现在您可以设置如下属性:

$class = new MyClass;
$class->abc = 'New Value';

然后像这样访问它:

echo $class->abc; //output should be: New Value

如果您想使用$class->abc('New Value')而不是$class->abc = 'new value'等方法设置值,则可以使用__call($name, $value)代替__set($name, $value)