2017-05-17 9 views
0

にパラメータの正しい数を渡す私はここで次の操作を行います。が動的にクラスのコンストラクタ

public function fetch($className) 
{ 
    $rows = array(); 
    while($r = $this->result->fetch_object() { 
     $rows[] = new $className($r); 
    } 
    return $rows; 
} 

コンストラクタ

class User 
{ 
    public $dbh; 
    public $row; 
    public function __construct($dbh, $row = null) 
    { 
     $this->dbh = $dbh; 
     $this->row = $row; 
    } 
    public function getAll() 
    { 
     return $this->dbh->query('SELECT * FROM users')->fetchAll(); 
    } 
    public function getFirstName() 
    { 
     return $this->row->first_name; 
    } 
} 

をこれは良い、よく私のクラスのコンストラクタは、パラメータを1つだけ持っている場合は、すべてのです。

私はこのダイナミックを作成して、私のコンストラクタに他のパラメータを持たせることができます。これが理にかなってほしい。

何か助けが嬉しいです:-)

+0

あなたの構成機能はどこですか? – Akintunde007

+0

@Akintunde – Programit

答えて

0

これは依存しています。

まあ、実際には、あなたの一般的なコードスタイルに依存します。例えば。私はnewをSQLコードの近くで使用するのは好きではありません。それはSRPの違反の多くに見えます。私がやりがち何

はちょっと次のようになります。

public function applyValues($instance, array $parameters) 
{ 
    foreach ((array) $parameters as $key => $value) { 
     $method = 'set' . str_replace('_', '', $key); 
     if (method_exists($instance, $method)) { 
      $instance->{$method}($value); 
     } 
    } 
} 

は、私は個人的にはハックだと思いますが、それは私のコードの残りの部分を設計しますどのようにうまく動作します。


そして、あなたは、PHP 5.6+を使用している場合は、あなたのようなものになりますvariadics

使用することができます。

public function fetch($className) 
{ 
    $rows = array(); 
    while($parameters = $this->result->fetch_object() { 
     $rows[] = new $className(...$parameters); 
    } 
    return $rows; 
} 

をしかし、このアプローチは本当に壊れやすいだろうとで厳密な順序が必要になります$parametersアレイ。


も第三の選択肢があります:あなたはあなたのドメインエンティティのすべてでpopulate()方法のようなものを持っていることは、そのような方法であなたのコードを設計します。しかし、エンティティが自分の工場を含むべきではないのと同じ理由から、これは悪い考えです。

関連する問題