2017-05-18 1 views
0

Ich habe eine Klasse namens Items, bei Instanziierung sollte die Klasse 5+ Werte erhalten. Ich weiß, dass die Übergabe von mehr als (3-4) Variablen an den Konstruktor ein schlechtes Design anzeigt.Übergeben von Werten an den Klassenkonstruktor (Variablen vs Array)

Was ist die beste Methode, um diese Anzahl von Variablen an Konstruktoren zu übergeben?

Meine erste Option:

class Items { 

    protected $name; 
    protected $description; 
    protected $price; 
    protected $photo; 
    protected $type; 

    public function __construct($name, $description, $price, $photo, $type) 
    { 
     $this->name = $name; 
     $this->description = $description; 
     $this->price = $price; 
     $this->photo = $photo; 
     $this->type = $type; 
    } 

    public function name() 
    { 
     return $this->name; 
    } 

und die zweite Option:

class Items { 
    protected $attributes; 

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

    public function name() 
    { 
     return $this->attributes['name']; 
    } 
} 
+0

Sie sollten eine gemischte Lösung verwenden. Übergeben Sie das Array an den Konstruktor. Im Konstruktor 'extrahieren' Sie dieses Array und weisen Sie Variablen einzeln zu. Extrahieren Sie die Referenz http://php.net/manual/en/function.extract.php –

+0

Alles ok außer Methode 'name' in den' Items'. –

Antwort

0

Sie haben auch Architektur mit der ersten Lösung. Aber wenn Ihre Eigenschaften dynamisch sind und Sie nicht wissen, was sie sind, können Sie es mit einer zweiten Lösung implementieren. In diesem Fall können Sie die modifizierte zweite Option verwenden:

class Items { 
    protected $attributes; 

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

    public function getAttributes() 
    { 
     return $this->attributes; 
    } 
} 

$items = new Items($attributes); 

foreach ($items->getAttributes() as $attribute) { 
    echo $attribute->name; 
} 
+1

Danke, ich glaube, das ist das Beste, was ich bekommen kann, ich kann $ items-> getAttributes() -> Name mit O (1) Zeit Komplexität, anstatt O (n) mit einer Schleife jedes Mal. Prost :) –

Verwandte Themen