Some of posts from this blog has been moved to dywicki.pl. You will be automatically redirected to new blog if you would submit comment.
New posts are published on dywicki.pl, this blog contains old content and it is not continued.

Niektóre posty z tego bloga zostały przeniesione do dywicki.pl. Zostaniesz automatycznie przekierowany jeśli bedzięsz chciał dodać komentarz.
Nowe posty sa publikowane na dywicki.pl, ten blog zawiera stare treści i nie jest kontynuowany.

Tworzenie nowej instancji klasy…

Filed under PHP by

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? :)

2 responses so far

2 Responses to “Tworzenie nowej instancji klasy…”

  1. Vee says:

    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?

  2. splatch says:

    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. :)

Leave a Reply