2009-10-09 10 views
5

Gibt es eine Möglichkeit, eine Klasseninstanz durch eine String-Repräsentation aufzurufen?Wie "ruft" eine Klasseninstanz in PHP auf?

In diesem Fall i-Code wie folgt aussehen erwarten:

class MyClass { 
    public $attribute; 
} 

$obj = getInstanceOf("MyClass"); //$obj is now an instance of MyClass 
$obj->attribute = "Hello World"; 

Ich denke, das muss möglich sein, wie PHP Soapclient eine Liste von classMappings akzeptiert, die ein WSDL-Elemente an eine PHP-Klasse zur Karte verwendet wird, . Aber wie ruft der SoapClient die Klasseninstanzen auf?

Antwort

22
$class = 'MyClass'; 
$instance = new $class; 

Allerdings, wenn Ihre Klasse Konstruktor eine variable Anzahl von Argumenten akzeptiert, und Sie halten diese Argumente in einem Array (eine Art call_user_func_array), haben Sie Reflektion verwenden:

$class = new ReflectionClass('MyClass'); 
$args = array('foo', 'bar'); 
$instance = $class->newInstanceArgs($args); 

Es gibt auch ReflectionClass::newInstance, aber es macht das gleiche wie die erste Option oben.

Referenz:

+0

Ah Tanks, das ist einfach. :-D Noch eine Frage, gibt es eine Möglichkeit zu testen, ob diese Klasse wirklich existiert? Like: if (classExists ("MyClass")) { $ obj = getInstanceOf ("MyClass"); } – NovumCoder

+0

Es gibt 'class_exists()': http://www.php.net/manual/en/function.class-exists.php. Achten Sie jedoch auf das zweite Argument. –

+0

Danke Jungs. ReflectionClass ist die perfekte Lösung. Nun, ich habe vergessen, dass das Reflection nicht aufgerufen wird. :-) – NovumCoder

6

Wenn die Anzahl der Argumente, die von den Konstruktor benötigt bekannt und konstant ist, kann man (wie andere vorgeschlagen haben) zu tun dies:

$className = 'MyClass'; 
$obj = new $className($arg1, $arg2, etc.); 
$obj->attribute = "Hello World"; 

Als Alternative könnten Sie Reflection verwenden. Dies bedeutet auch, dass Sie ein Array von Konstruktorargumenten bereitstellen können, wenn Sie nicht wissen, wie viele Sie benötigen.

<?php 
$rf = new ReflectionClass('MyClass'); 
$obj = $rf->newInstanceArgs($arrayOfArguments); 
$obj->attribute = "Hello World"; 
6

Die anderen Antworten werden in PHP < = 5,5, arbeiten aber diese Aufgabe wird 5.6 viel einfacher in PHP, wo man nicht einmal Reflektion verwenden müssen. Just do:

<?php 

class MyClass 
{ 
    public function __construct($var1, $var2) 
    {} 
} 

$class = "MyClass"; 
$args = ['someValue', 'someOtherValue']; 

// Here's the magic 
$instance = new $class(...$args); 
+0

Diese Antwort benötigt mehr Upvotes. Hatte keine Ahnung, der "Splat" -Operator existierte sogar bis heute! http://php.net/manual/de/migration56.new-features.php#migration56.new-features.splat – Andy