我观看过的许多有关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方法更好吗?谢谢!
答案 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)