2016-12-24 2 views
1

Ich bin eine einfache Klasse für Abhängigkeiten zu machen, um nicht mehrere Instanzen zu erstellen:PHP: Wie Parameter zu einer Abhängigkeit Behälter passieren

class Container { 

    private static $instance = array(); 

    public function use($class) { 

     if (!isset(self::$instance[$class])) { 

      self::$instance[$class] = new $class(); 

     } 

     return self::$instance[$class]; 

    } 

} 

Und jetzt kann ich es mag:

$Container = new Container; 

$Class = $Container->use('SomeClass'); 

Dies wäre das Äquivalent:

$Class = new Class; 

Doch wie würde ich diese Container Klasse so ändern, dass Ich kann (eine unbekannte Anzahl von) Parametern an die Klassen übergeben, für die ich eine Instanz von? Als ob ich das tun müsste:

$Class = new Class($param1, $param2); 
+0

warum nicht ein '__construct()' hinzufügen? – CodeGodie

+0

@CodeGodie Welchen Zweck würde das erfüllen? – JROB

Antwort

1

Dies ist, was ich meine, indem Sie eine __construct() hinzufügen. Das Konstrukt wird ausgeführt, wenn Sie die Klasse instanziieren und Ihre mehreren gewünschten Argumente in einem Array-Format verwenden.

class Container 
{ 
    private static $instance = []; 

    public function useClass($class, $args) 
    { 
     if (!isset(self::$instance[$class])) { 
      self::$instance[$class] = new $class($args); 
     } 
     return self::$instance[$class]; 
    } 
} 

class User 
{ 
    private $name; 
    private $age; 

    public function __construct($args) 
    { 
     $this->name = $args['name']; 
     $this->age = $args['age']; 
    } 

} 


$Container = new Container; 

$args = [ 
    "name" => 'John', 
    "age" => 29 
]; 

$user = $Container->useClass('User', $args); 

var_dump($Container); 
var_dump($user); 
+0

Ich habe nur drei kleine Klassen geladen, und ich bekomme Fatal error: erlaubte Speicherbytes erschöpft ... – JROB

0

Machst du das als Test für dich selbst? Wenn das nicht der Fall ist und Sie sich dessen nicht bewusst sind, gibt es in PHP mehrere Bibliotheken, mit denen Sie genau das tun können, wonach Sie fragen: einen Dependency-Injection-Container.

Als ein einfaches, können Sie sich Pimple for PHP ansehen. Ein sehr einfacher Behälter.

Wenn Sie mit Ihrer Lösung fortfahren möchten, sollten Sie etwas wie die func_get_args(); Funktion verwenden.

+2

Ich schaue Pickel an, aber selbst das ist mehr als ich brauche. Ich verstehe nicht, warum eine einfache Klasse wie diese nicht ausreichen würde. – JROB

+0

Pimple ist wirklich nur ein Array mit Objekten, nichts anderes ... Also ist es eigentlich das gleiche wie deine Klasse, halte es nicht für einen vollwertigen Dependency-Injektionscontainer. –

Verwandte Themen