2017-05-17 7 views
0

Ich tue dies hier:dynamisch richtige Anzahl von Parametern Klasse Konstruktor

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

Constructor

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

Das ist alles gut und gut, wenn meine Klasse Konstruktor hat nur einen Parameter.

Wie mache ich das dynamisch, damit ich andere Parameter in meinem Konstruktor haben kann. Hoffe, das macht Sinn.

Jede Hilfe wäre genial :-)

+0

wo ist Ihre Konstrukt-Funktion – Akintunde007

+0

hinzugefügt @Akintunde – Programit

Antwort

0

Kommt drauf an.

Nun, es hängt wirklich davon ab, was ist Ihr allgemeiner Code-Stil. Beispielsweise. Ich mag nicht new in der Nähe von meinem SQL-Code verwenden. Es scheint zu viel SRP Verletzung.

Was ich neige dazu, sieht ein bisschen wie dies zu tun:

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

Ich persönlich denke, dass es ein Hack, aber es funktioniert gut mit, wie Rest meines Codes entworfen wird.


Und wenn Sie PHP 5.6+ verwenden, können Sie variadics

verwenden, die etwas aussehen würde:

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

Aber dieser Ansatz wird wirklich zerbrechlich und erfordert strenge Ordnung in das $parameters Array.


Es gibt auch dritte Option: entwerfen Sie Ihren Code so, dass Sie so etwas wie populate() Methode in allen Domänen Entitäten haben. Aber das scheint aus dem gleichen Grund eine schlechte Idee zu sein, warum Entitäten ihre eigenen Fabriken nicht enthalten sollten.

Verwandte Themen