Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > pl.comp.lang.php > #15876 > unrolled thread
| Started by | Marek S <precz@spamowi.com> |
|---|---|
| First post | 2018-12-15 00:32 +0100 |
| Last post | 2019-01-08 20:47 +0100 |
| Articles | 10 — 3 participants |
Back to article view | Back to pl.comp.lang.php
Dependecy injection - jak to działa? Marek S <precz@spamowi.com> - 2018-12-15 00:32 +0100
Re: Dependecy injection - jak to działa? Wojciech Bancer <wojciech.bancer@gmail.com> - 2018-12-15 01:06 +0100
Re: Dependecy injection - jak to działa? Marek S <precz@spamowi.com> - 2018-12-15 23:26 +0100
Re: Dependecy injection - jak to działa? Borys Pogoreło <borys@pl.edu.leszno> - 2018-12-16 12:31 +0100
Re: Dependecy injection - jak to działa? Marek S <precz@spamowi.com> - 2019-01-02 21:25 +0100
Re: Dependecy injection - jak to działa? Borys Pogoreło <borys@pl.edu.leszno> - 2019-01-02 22:18 +0100
Re: Dependecy injection - jak to działa? Marek S <precz@spamowi.com> - 2019-01-03 21:35 +0100
Re: Dependecy injection - jak to działa? Borys Pogoreło <borys@pl.edu.leszno> - 2019-01-04 00:54 +0100
Re: Dependecy injection - jak to działa? Marek S <precz@spamowi.com> - 2019-01-08 20:43 +0100
Re: Dependecy injection - jak to działa? Marek S <precz@spamowi.com> - 2019-01-08 20:47 +0100
| From | Marek S <precz@spamowi.com> |
|---|---|
| Date | 2018-12-15 00:32 +0100 |
| Subject | Dependecy injection - jak to działa? |
| Message-ID | <pv1eid$s19$1@node2.news.atman.pl> |
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
[toc] | [next] | [standalone]
| From | Wojciech Bancer <wojciech.bancer@gmail.com> |
|---|---|
| Date | 2018-12-15 01:06 +0100 |
| Message-ID | <slrnq18hch.a42.wojciech.bancer@pl-test.org> |
| In reply to | #15876 |
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
[toc] | [prev] | [next] | [standalone]
| From | Marek S <precz@spamowi.com> |
|---|---|
| Date | 2018-12-15 23:26 +0100 |
| Message-ID | <pv3v2k$228$1@node1.news.atman.pl> |
| In reply to | #15877 |
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
[toc] | [prev] | [next] | [standalone]
| From | Borys Pogoreło <borys@pl.edu.leszno> |
|---|---|
| Date | 2018-12-16 12:31 +0100 |
| Message-ID | <zh5xsvsue6hi$.1dwdbwvgnw36w$.dlg@40tude.net> |
| In reply to | #15877 |
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
[toc] | [prev] | [next] | [standalone]
| From | Marek S <precz@spamowi.com> |
|---|---|
| Date | 2019-01-02 21:25 +0100 |
| Message-ID | <q0j6nq$b92$2@node2.news.atman.pl> |
| In reply to | #15883 |
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
[toc] | [prev] | [next] | [standalone]
| From | Borys Pogoreło <borys@pl.edu.leszno> |
|---|---|
| Date | 2019-01-02 22:18 +0100 |
| Message-ID | <65gtnyttdedm.eb9c8v75r5ke.dlg@40tude.net> |
| In reply to | #16005 |
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
[toc] | [prev] | [next] | [standalone]
| From | Marek S <precz@spamowi.com> |
|---|---|
| Date | 2019-01-03 21:35 +0100 |
| Message-ID | <q0lrml$ral$1@node2.news.atman.pl> |
| In reply to | #16007 |
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
[toc] | [prev] | [next] | [standalone]
| From | Borys Pogoreło <borys@pl.edu.leszno> |
|---|---|
| Date | 2019-01-04 00:54 +0100 |
| Message-ID | <4cwhmtyiua45.y4ummhnkqoha.dlg@40tude.net> |
| In reply to | #16011 |
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
[toc] | [prev] | [next] | [standalone]
| From | Marek S <precz@spamowi.com> |
|---|---|
| Date | 2019-01-08 20:43 +0100 |
| Message-ID | <q12uhd$mtn$1@node1.news.atman.pl> |
| In reply to | #16013 |
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
[toc] | [prev] | [next] | [standalone]
| From | Marek S <precz@spamowi.com> |
|---|---|
| Date | 2019-01-08 20:47 +0100 |
| Message-ID | <q12upd$mtn$2@node1.news.atman.pl> |
| In reply to | #16019 |
(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
[toc] | [prev] | [standalone]
Back to top | Article view | pl.comp.lang.php
csiph-web