Thread View: pl.comp.lang.php
10 messages
10 total messages
Started by Marek S
Fri, 14 Dec 2018 23:32
Dependecy injection - jak to działa?
Author: Marek S
Date: Fri, 14 Dec 2018 23:32
Date: Fri, 14 Dec 2018 23:32
34 lines
1915 bytes
1915 bytes
Witam,
Przy klasycznym podejściu do programowania tworzymy klasę i jakąś metodę
z określonymi parametrami. Przy jej wywołaniu przekazujemy takie
parametry jak były zdefiniowane. Tyma czasem w Laravelu jest odwrotnie.
Konstruktor kontrolera może posiadać dowolne parametry i zostaną one
właściwie przekazane.
Moje pytanie brzmi: jak w PHP napisać funkcję/metodę, która będzie
otrzymywała instancje obiektów takich jak podamy w parametrach wywołania?
Zobrazuję to. Mamy funkcję:
function x(klasa a) {}
Zwykle wywołujemy tą funkcję jako x(new classA());
A teraz odwracamy sytuację i w funkcji deklarujemy co chcemy otrzymać, a
wywołanie funkcji ma być z tym zgodne:
function x(niespodzianka a, niespodzianka2 b) {}
Jak zrobić to aby funkcja x przyjęła dane zgodnie z listą parametrów?
Czyli chciałbym wykonać coś takiego (opisowo):
if (parametrFukcjiJestTypuNiespodzianka) p1=new niespodzianka();
if (parametr2FukcjiJestTypuNiespodzianka2) p2=new niespodzianka2();
x(p1,p2);
--
Pozdrawiam,
Marek
Re: Dependecy injection - jak to działa?
Author: Wojciech Bancer
Date: Sat, 15 Dec 2018 00:06
Date: Sat, 15 Dec 2018 00:06
21 lines
1614 bytes
1614 bytes
On 2018-12-14, Marek S <precz@spamowi.com> wrote: [...] > Czyli chciałbym wykonać coś takiego (opisowo): > > if (parametrFukcjiJestTypuNiespodzianka) p1=new niespodzianka(); > if (parametr2FukcjiJestTypuNiespodzianka2) p2=new niespodzianka2(); > > x(p1,p2); http://php.net/manual/en/reflectionparameter.gettype.php http://php.net/manual/pl/reflectionclass.newinstance.php http://php.net/manual/pl/reflectionclass.newinstanceargs.php i ogólnie: http://php.net/manual/en/reflectionparameter.gettype.php -- Wojciech Bańcer wojciech.bancer@gmail.com
Re: Dependecy injection - jak to działa?
Author: Marek S
Date: Sat, 15 Dec 2018 22:26
Date: Sat, 15 Dec 2018 22:26
10 lines
1111 bytes
1111 bytes
W dniu 2018-12-15 o 01:06, Wojciech Bancer pisze: > i ogólnie: > http://php.net/manual/en/reflectionparameter.gettype.php Dzięki! :-) -- Pozdrawiam, Marek
Re: Dependecy injection - jak to działa?
Author: Borys Pogoreło
Date: Sun, 16 Dec 2018 11:31
Date: Sun, 16 Dec 2018 11:31
11 lines
1132 bytes
1132 bytes
Dnia Sat, 15 Dec 2018 01:06:41 +0100, Wojciech Bancer napisał(a): > i ogólnie: > http://php.net/manual/en/reflectionparameter.gettype.php Raczej chodzi po prostu o operator instanceof, bo chce inicjalizować obiekty. -- Borys Pogoreło borys(#)leszno,edu,pl
Re: Dependecy injection - jak to działa?
Author: Marek S
Date: Wed, 02 Jan 2019 20:25
Date: Wed, 02 Jan 2019 20:25
13 lines
1412 bytes
1412 bytes
W dniu 2018-12-16 o 12:31, Borys Pogoreło pisze: > Raczej chodzi po prostu o operator instanceof, bo chce inicjalizować > obiekty. Sądzisz, że tak? Ja nie bardzo sobie wyobrażam jak wywołać funkcję i przekazać jej parametry zgodnie z fantazją twórcy tejże funkcji. Instanceof działa post factum. Tymczasem typy argumentów trzeba znać _ZANIM_ wywoła się daną funkcję. -- Pozdrawiam, Marek
Re: Dependecy injection - jak to działa?
Author: Borys Pogoreło
Date: Wed, 02 Jan 2019 21:18
Date: Wed, 02 Jan 2019 21:18
18 lines
1616 bytes
1616 bytes
Dnia Wed, 2 Jan 2019 21:25:19 +0100, Marek S napisał(a): > Sądzisz, że tak? Ja nie bardzo sobie wyobrażam jak wywołać funkcję i > przekazać jej parametry zgodnie z fantazją twórcy tejże funkcji. > Instanceof działa post factum. Tymczasem typy argumentów trzeba znać > _ZANIM_ wywoła się daną funkcję. To chyba normalne w każdym normalnym [1] języku obsługującym typowanie? Jeśli masz konieczność przekazania do funkcji różnego typu parametrów, to nie definiuj typów. A jeśli pracujesz z istniejącym kodem, to się dostosuj do interfejsu. [1] niekoniecznie PHP, choć idzie ku lepszemu -- Borys Pogoreło borys(#)leszno,edu,pl
Re: Dependecy injection - jak to działa?
Author: Marek S
Date: Thu, 03 Jan 2019 20:35
Date: Thu, 03 Jan 2019 20:35
43 lines
2436 bytes
2436 bytes
W dniu 2019-01-02 o 22:18, Borys Pogoreło pisze:
>> Sądzisz, że tak? Ja nie bardzo sobie wyobrażam jak wywołać funkcję i
>> przekazać jej parametry zgodnie z fantazją twórcy tejże funkcji.
>> Instanceof działa post factum. Tymczasem typy argumentów trzeba znać
>> _ZANIM_ wywoła się daną funkcję.
>
> To chyba normalne w każdym normalnym [1] języku obsługującym typowanie?
Chyba się nie rozumiemy. To moim zdaniem nie mocno nienormalne. Może
opiszę to częściowo kodem. Piszemy klasę framework i metodę run():
abstract class framework {
private function run() {
switch (wezTypArgumentuProgramisty( $this->execute) {
case User: $this->execute(new User); break;
case Dog: $this->execute(new Dog); break;
}
$this->execute("abc");
}
abstract protected function execute($param) {}
}
Programista pisze dwie klasy dziedziczące w/w i nadpisujące metodę execute:
class mine1 extends framework {
protected function execute(User $user) { do something }
}
class mine2 extends framework {
protected function execute(Dog $dog) { do something }
}
Czy takie programowanie jest normalne, gdzie programista wymyśla sobie
argumenty do funkcji a framework krakuje klasy potomne programisty w
celu wyłuskania typów oczekiwanych argumentów i takie je przekazuje?
--
Pozdrawiam,
Marek
Re: Dependecy injection - jak to działa?
Author: Borys Pogoreło
Date: Thu, 03 Jan 2019 23:54
Date: Thu, 03 Jan 2019 23:54
18 lines
1818 bytes
1818 bytes
Dnia Thu, 3 Jan 2019 21:35:21 +0100, Marek S napisał(a): > Czy takie programowanie jest normalne, gdzie programista wymyśla sobie > argumenty do funkcji a framework krakuje klasy potomne programisty w > celu wyłuskania typów oczekiwanych argumentów i takie je przekazuje? Przede wszystkim to nie jest dozwolone. Czy raczej: skończy się ostrzeżeniem, kod się wykona, ale nie bez powodu otrzymasz to ostrzeżenie. Nie powinieneś zmieniać deklaracji klasy z powodu możliwości stworzenia takich właśnie niespodzianek. Dozwolone jest co najwyżej rozszerzanie deklaracji o nowe argumenty. I chyba nadal nie przeczytałeś dokładnie jak działa DI w Laravelu, bo cały czas próbujesz na nowo wymyślić to, co jest podane na tacy. -- Borys Pogoreło borys(#)leszno,edu,pl
Re: Dependecy injection - jak to działa?
Author: Marek S
Date: Tue, 08 Jan 2019 19:43
Date: Tue, 08 Jan 2019 19:43
26 lines
2069 bytes
2069 bytes
W dniu 2019-01-04 o 00:54, Borys Pogoreło pisze: > Przede wszystkim to nie jest dozwolone. Czy raczej: skończy się > ostrzeżeniem, kod się wykona, ale nie bez powodu otrzymasz to ostrzeżenie. > Nie powinieneś zmieniać deklaracji klasy z powodu możliwości stworzenia > takich właśnie niespodzianek. Dozwolone jest co najwyżej rozszerzanie > deklaracji o nowe argumenty. I o tym właśnie piszę. Absurd się wytworzył. Zrobiłem test z użyciem Reflections i dało się podobny algorytm wykonać bez żadnych ostrzeżeń. Można dowolnie hakować metody klas. >I chyba nadal nie przeczytałeś dokładnie jak działa DI w Laravelu, bo > cały czas próbujesz na nowo wymyślić to, co jest podane na tacy. Gdybym na tę tacę natrafił, to nie tworzyłbym wątku. Czytam dokumentację oficjalną: https://laravel.com/docs/5.7 a w niej dział omawiający DI: -- Pozdrawiam, Marek
Re: Dependecy injection - jak to działa?
Author: Marek S
Date: Tue, 08 Jan 2019 19:47
Date: Tue, 08 Jan 2019 19:47
11 lines
1506 bytes
1506 bytes
(przypadkiem wysłało mi się za wcześnie) > a w niej dział omawiający DI: https://laravel.com/docs/5.7/controllers#dependency-injection-and-controllers W innym wątku próbowałem analizować bezskutecznie źródła frameworka by rozkminić to i owo skoro opisu na stronie producenta nie znalazłem. -- Pozdrawiam, Marek
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads