Jeśli oddzielanie instancji od inicjalizacji nie jest ściśle wymagane, istnieją dwie inne możliwości: po pierwsze, statyczna metoda fabryczna.
class Test {
public function __construct($param1, $param2, $param3) {
echo $param1.$param2.$param3;
}
public static function CreateTest($param1, $param2, $param3) {
return new Test($param1, $param2, $param3);
}
}
$params = array('p1','p2','p3');
if(method_exists($ob,'__construct')) {
call_user_func_array(array($ob,'CreateTest'),$params);
}
Lub, jeśli używasz PHP 5.3.0 lub nowszy, można użyć lambda:
class Test {
public function __construct($param1, $param2, $param3) {
echo $param1.$param2.$param3;
}
}
$params = array('p1','p2','p3');
$func = function ($arg1, $arg2, $arg3) {
return new Test($arg1, $arg2, $arg3);
}
if(method_exists($ob,'__construct')) {
call_user_func_array($func, $params);
}
Sposób inicjalizacji opisany przez Asafa jest wielki, jeśli z jakiegoś powodu masz potrzebę logicznie oddzielić inicjalizację od tworzenia instancji, ale jeśli obsługa powyższego przypadku użycia jest szczególnym przypadkiem, a nie zwykłym wymogiem, może być niewygodne wymaganie od użytkowników utworzenia i zainicjowania obiektu w dwóch osobnych krokach.
Metoda fabryka jest dobra, ponieważ daje metodę wywoływania w celu uzyskania inicjowanej instancji. Obiekt jest inicjowany i tworzony w tej samej operacji, więc jeśli masz potrzebę oddzielenia dwóch, to nie będzie działać.
I na koniec, polecam lambdę, jeśli ten mechanizm inicjalizacji jest niezmiernie używany i nie chcesz zaśmiecać definicji klasy za pomocą inicjalizacji lub metod fabrycznych, które rzadko będą używane.
Zauważ, że jeśli parametry konstruktora są przekazywane przez odniesienie, a następnie call_user_func_array zawiedzie !! – Sarfraz