2009-10-09 13 views
5

Czy istnieje możliwość "wywołania" instancji klasy za pomocą reprezentacji łańcuchowej?Jak "wywołać" instancję klasy w PHP?

W tym przypadku by się spodziewać kod wyglądać tak:

class MyClass { 
    public $attribute; 
} 

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

Myślę, że to musi być możliwe, ponieważ PHP SoapClient akceptuje listę classMappings który służy do mapowania elementu WSDL do klasy PHP . Ale w jaki sposób SoapClient "wywołuje" instancje klasy?

Odpowiedz

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

Jednakże, jeśli twoja klasa konstruktor przyjmuje zmienną liczbę argumentów, a trzymasz te argumenty w tablicy (rodzaj call_user_func_array), trzeba użyć refleksji:

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

Istnieje również ReflectionClass::newInstance, ale robi to samo, co pierwsza opcja powyżej.

referencyjny:

+0

Ah czołgi, takie proste. :-D Jeszcze jedno pytanie, czy istnieje sposób na sprawdzenie, czy ta klasa naprawdę istnieje? Podobnych: if (classExists ("MyClass")) { $ obj = getInstanceOf ("MyClass"); } – NovumCoder

+0

Istnieje 'class_exists()': http://www.php.net/manual/en/function.class-exists.php. Uważaj jednak na drugi argument. –

+0

Dziękuję wam. ReflectionClass to idealne rozwiązanie. Cóż, zapomniałem, że nazywa się to Refleksja, a nie wywołanie. :-) – NovumCoder

6

Jeśli liczba argumentów potrzebnych konstruktora jest znane i stałe, można (jak inni sugerowali) zrobić to:

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

Jako alternatywę możesz użyć Odbicia. Oznacza to również, że możesz podać tablicę argumentów konstruktora, jeśli nie wiesz, ile będziesz potrzebować.

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

innych odpowiedzi będzie działać w PHP < = 5,5, ale to zadanie staje się o wiele łatwiejsze w PHP 5.6, w którym nie trzeba nawet używać refleksji. Po prostu:

<?php 

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

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

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

Ta odpowiedź potrzebuje więcej upvotes. Nie miałem pojęcia, że ​​operator "splat" istniał nawet do dzisiaj! http://php.net/manual/en/migration56.new-features.php#migration56.new-features.splat – Andy