我如何知道在构造函数中加载什么以及稍后使用set方法设置什么?
例如,我有一个问题类,大部分时间都会调用以下变量:
protected $question;
protected $content;
protected $creator;
protected $date_added;
protected $id;
protected $category;
目前我已经拥有它,所以在构造函数中只设置了基本要素$id
,$question
和$content
所以我不会开始构建庞大的构造函数列表参数。然而,这意味着当我在其他地方创建一个新的问题对象时,我必须直接设置该对象的其他属性,意思是“setter代码”在整个地方重复。
我是否应该立即将它们全部传递给构造函数,按照我已经这样做的方式进行,或者是否有一个我错过的更好的解决方案?感谢。
答案 0 :(得分:0)
根据语言的不同,任何一个类都可以有多个构造函数。
答案 1 :(得分:0)
您可以使用数组作为构造函数或setter方法的参数。
只是示例:
public function __construct($attributes = array()) {
$this->setAttributes($attributes);
}
public function setAttributes($attributes = array()) {
foreach ($attributes as $key => $value) {
$this->{$key} = $value;
}
}
答案 2 :(得分:0)
PHP不支持传统的构造函数重载(与其他OO语言一样)。一个选项是将一组参数传递给构造函数:
public function __construct($params)
{
}
// calling it
$arr = array(
'question' => 'some question',
'content' => ' some content'
...
);
$q = new Question($arr);
使用它,您可以自由地传递可变数量的参数,并且不依赖于参数的顺序。同样在构造函数中,您可以设置默认值,因此如果不存在变量,请使用默认值。
答案 3 :(得分:0)
流畅的界面是另一种解决方案。
class Foo {
protected $question;
protected $content;
protected $creator;
...
public function setQuestion($value) {
$this->question = $value;
return $this;
}
public function setContent($value) {
$this->content = $value;
return $this;
}
public function setCreator($value) {
$this->creator = $value;
return $this;
}
...
}
$bar = new Foo();
$bar
->setQuestion('something')
->setContent('something else')
->setCreator('someone');
或使用继承......
class Foo {
protected $stuff;
public function __construct($stuff) {
$this->stuff = $stuff;
}
...
}
class bar extends Foo {
protected $moreStuff;
public function __construct($stuff, $moreStuff) {
parent::__construct($stuff);
$this->moreStuff = $moreStuff;
}
...
}
或使用可选参数......
class Foo {
protected $stuff;
protected $moreStuff;
public function __construct($stuff, $moreStuff = null) {
$this->stuff = $stuff;
$this->moreStuff = $moreStuff;
}
...
}
无论如何,有很多好的解决方案。请不要使用单个数组作为params或func_get_args或_ get / _set / __ call magic,除非你有充分的理由这样做,并且已经用尽所有其他选项。
答案 4 :(得分:0)
我会使用我想要设置的值将数组传递给构造函数。
public function __construct(array $values = null)
{
if (is_array($values)) {
$this->setValues($values);
}
}
然后你需要一个方法setValues
来动态设置值。
public function setValues(array $values)
{
$methods = get_class_methods($this);
foreach ($values as $key => $value) {
$method = 'set' . ucfirst($key);
if (in_array($method, $methods)) {
$this->$method($value);
}
}
return $this;
}
为此,您需要为setQuestion($value)
等属性设置setter方法。