0

我如何知道在构造函数中加载什么以及稍后使用 set 方法设置什么?

例如,我有一个问题类,大部分时间会调用以下变量:

protected $question;
protected $content;
protected $creator;
protected $date_added;
protected $id;
protected $category;

目前我拥有它,所以只有最基本$id$question, 和$content被设置在构造函数中,所以我不会开始构建大量的构造函数参数。然而,这意味着当我在其他地方创建一个新的问题对象时,我必须在意味着“设置器代码”在各处重复之后立即设置该对象的其他属性。

我是否应该立即将它们全部传递给构造函数,按照我已经这样做的方式进行,还是有更好的解决方案我错过了?谢谢。

4

5 回答 5

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

  ...
}

无论如何,有很多好的解决方案。请不要将单个数组用作参数或 func_get_args 或_get / _set/__call 魔术,除非您有充分的理由这样做,并且已经用尽了所有其他选项。

于 2013-02-18T13:38:04.143 回答
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)等。

于 2013-02-18T13:39:51.340 回答
0

根据语言,任何一个类都可以有多个构造函数。

于 2013-02-18T13:28:11.537 回答
0

您可以使用数组作为构造函数或 setter 方法的参数。

举个例子:

public function __construct($attributes = array()) {
  $this->setAttributes($attributes);
}  

public function setAttributes($attributes = array()) {
  foreach ($attributes as $key => $value) {
    $this->{$key} = $value;
  }
}
于 2013-02-18T13:32:16.193 回答
0

PHP 不支持传统的构造函数重载(与其他 OO 语言一样)。一种选择是将参数数组传递给构造函数:

public function __construct($params)
{

}

// calling it
$arr = array(
    'question' => 'some question',
    'content' => ' some content'
    ...
);
$q = new Question($arr);

使用它,您可以自由传递可变数量的参数,并且不依赖于参数的顺序。同样在构造函数中,您可以设置默认值,因此如果变量不存在,请使用默认值。

于 2013-02-18T13:32:35.177 回答