0

コンストラクターに何をロードし、後で set メソッドを使用して何を設定するかを知るにはどうすればよいですか?

たとえば、ほとんどの場合、次の変数を呼び出す質問クラスがあります。

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

現時点では、必要最小限$idの 、$question、およびのみ$contentがコンストラクターに設定されているため、コンストラクター引数の膨大なリストの作成を開始しません。ただし、これは、別の場所で新しい質問オブジェクトを作成する場合、「セッター コード」があちこちに複製されることを意味した直後に、そのオブジェクトの他のプロパティを設定する必要があることを意味します。

それらすべてをすぐにコンストラクタに渡す必要がありますか? ありがとう。

4

5 に答える 5

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

言語によっては、1 つのクラスに対して複数のコンストラクターを持つことができます。

于 2013-02-18T13:28:11.537 に答える
0

コンストラクターまたはセッター メソッドへのパラメーターとして配列を使用できます。

例:

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 に答える
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 マジックとして使用しないでください。そうする正当な理由がなく、他のすべてのオプションを使い果たした場合を除きます。

于 2013-02-18T13:38:04.143 に答える