2011-12-16 14 views
8

Jak mogę zadzwonić do konstruktora obiektu przechodzącego szereg parametrów tak, że posiadanie:Mijając tablicę parametrów do konstruktora obiektu

$array = array($param1, $param2); 

będę mógł zadzwonić

$abc = new Abc($param1, $param2); 

zważywszy, że nie wiem, ile parametrów można ustawić w tablicy. Czy jest coś takiego jak call_object('Abc', array($param1, $param2))?

+3

dlaczego po prostu nie przekazać tablicy? 'nowy abc (tablica $)'? – ManseUK

+2

Może Jeff nie pisze/kontroluje tych klas ... – VolkerK

+0

@JeffPigarelli być może, gdybyś lepiej sformułował swoje pytanie lub podał więcej przykładu, nie dostałbyś tak wielu "nieprawidłowych" odpowiedzi ... – ManseUK

Odpowiedz

2

Zakładając cię są w stanie modyfikować konstruktorów obiektami, wzór jak to nie jest niczym niezwykłym, ale wymaga tablic asocjacyjnych jak wejście:

class Abc { 
    public $prop1; 
    public $prop2; 

    public function __construct($params) { 
    if (is_array($params)) { 
     $this->prop1 = isset($params['prop1']) ? $params['prop1'] : NULL; 
     $this->prop2 = isset($params['prop2']) ? $params['prop2'] : NULL; 
    } 
    } 
} 

// Created as: 
$params = array('prop1'=>12354, 'prop2'=>54321); 
$abc = new Abc($params); 
+0

To wygrało ' t działa, jeśli chcesz użyć wpisanego konstruktora. – digitaldonkey

4

Ideałem jest, aby zdefiniować konstruktor wziąć Arra y.

Jeśli nie możesz tego zrobić, istnieje możliwość obejścia tego problemu. Jeśli wszystkie parametry do konstruktora są opcjonalne, można zrobić coś takiego z call_user_func_array:

$obj = new Abc; 
call_user_func_array(array($obj, '__construct'), $array); 

Wynika to w konstruktora prowadzony dwukrotnie: raz bez parametrów, a raz z tymi w tablicy. Musisz zdecydować, czy jest to odpowiednie dla twojej aplikacji.

+0

Uhm! A co jeśli twój konstruktor ABC potrzebuje parametrów? PHP Błąd krytyczny: Uncaught ArgumentCountError: Za mało argumentów dla funkcji Abc :: __ construct(), minęło 0. Więc nie można instanziować obiektu, a następnie wywołać konstruktora. Czegoś mi brakuje? – guido

+0

@guido "Jeśli * all * parametry do konstruktora są opcjonalne." To nie jest dobra praktyka: to obejście. – lonesomeday

10

Co powiesz na używanie ... (operatora splat)?

$array = array($param1, $param2); 
$abc = new Abc(...$array); // equal to: new Abc($param1, $param2) 

PHP 5.6 jest wymagane.

Powiązane problemy