🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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?
#232136
Author: Marek S
Date: Fri, 14 Dec 2018 23:32
34 lines
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?
#232137
Author: Wojciech Bancer
Date: Sat, 15 Dec 2018 00:06
21 lines
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?
#232138
Author: Marek S
Date: Sat, 15 Dec 2018 22:26
10 lines
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?
#232139
Author: Borys Pogoreło
Date: Sun, 16 Dec 2018 11:31
11 lines
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?
#232140
Author: Marek S
Date: Wed, 02 Jan 2019 20:25
13 lines
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?
#232141
Author: Borys Pogoreło
Date: Wed, 02 Jan 2019 21:18
18 lines
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?
#232142
Author: Marek S
Date: Thu, 03 Jan 2019 20:35
43 lines
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?
#232143
Author: Borys Pogoreło
Date: Thu, 03 Jan 2019 23:54
18 lines
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?
#232144
Author: Marek S
Date: Tue, 08 Jan 2019 19:43
26 lines
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?
#232145
Author: Marek S
Date: Tue, 08 Jan 2019 19:47
11 lines
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