Feb 27 2006
Tworzenie nowej instancji klasy…
Filed under PHP by Łukasz Dywicki
Nie wiem jak Wy, ale ja kilka razy spotkałem się z sytuacją, że chciałem przekazać do konstuktora kilka argumentów, ale niestety urocze call_user_func_array nie daje takiej możliwości. Dlatego też w PSF musiałem wynaleść takie coś jak interfejs LazyService by móc tworzyć usługi doiero w chwili ich wywołania. Sam sposób nie jest najleszy.
Teraz, po niewczasie znalazłem sosób na to, sposób bardzo prosty, który nie wymusza użycie eval – swoją drogą kolejny dowód na to, że bez eval da się żyć :) – oto on:
$r = new ReflectionClass('ClassName');
$r->newInstance(1,2,3);
Do konstruktora zostaną przekazane trzy argumenty – 1, 2 oraz 3. Konstrukcje eval do tworzenia nowych bytów wdziałem w implementacji IoC dla PHP, mianowicie w PicoContainer. Swoją drogą dziwne, ponieważ biblioteka sporo korzysta z Reflection API.. czyżby pora na zmiany?.. w kodzie? :)
Chyba nie rozumiem, na co ci te ReflectionAPI. Czy samo:
class Name
{
public function __construct()
{
$args = func_get_args();
}
}
$obj = new Name(1, 2, 3);
nie wystarcza?
Owszem chodzi tutaj o stworzenie nowego obiektu z dynamiczną liczbą argumentów, ale rzecz w tym by nie wymuszać obsługi tego w klasie, dosłownie bez dotykania kodu samej klasy. Wyobrażasz sobie wrzucanie wszędzie kilku linijek:
$args = func_get_args();
$foo = $args[0];
$bar = $args[1];
Nie sądzę, w końcu programista to leniwy zwierz. :)
Patrząc z drugiej strony – w PSF miałem dylemat z LazyService – by utworzyć nowy obiekt z opóźnieniem musiałem wymusić implementowanie interfejsu LazyService z metodą statyczną by móc przekazać do konstruktora przez nią argumenty. Korzystałem wówczas z func_get_args. Teraz już bym nie musiał tworzyć takich zawiłych konstrukcji. :)