Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > pl.comp.lang.php > #15876 > unrolled thread

Dependecy injection - jak to działa?

Started byMarek S <precz@spamowi.com>
First post2018-12-15 00:32 +0100
Last post2019-01-08 20:47 +0100
Articles 10 — 3 participants

Back to article view | Back to pl.comp.lang.php


Contents

  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

#15876 — Dependecy injection - jak to działa?

FromMarek S <precz@spamowi.com>
Date2018-12-15 00:32 +0100
SubjectDependecy 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]


#15877

FromWojciech Bancer <wojciech.bancer@gmail.com>
Date2018-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]


#15878

FromMarek S <precz@spamowi.com>
Date2018-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]


#15883

FromBorys Pogoreło <borys@pl.edu.leszno>
Date2018-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]


#16005

FromMarek S <precz@spamowi.com>
Date2019-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]


#16007

FromBorys Pogoreło <borys@pl.edu.leszno>
Date2019-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]


#16011

FromMarek S <precz@spamowi.com>
Date2019-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]


#16013

FromBorys Pogoreło <borys@pl.edu.leszno>
Date2019-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]


#16019

FromMarek S <precz@spamowi.com>
Date2019-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]


#16020

FromMarek S <precz@spamowi.com>
Date2019-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