znaczacy > comp.lang.* > comp.lang.php

Marek S (15.12.2018, 01:32)
Witam,

Przy klasycznym podejsciu do programowania tworzymy klase i jakas metode
z okreslonymi parametrami. Przy jej wywolaniu przekazujemy takie
parametry jak byly zdefiniowane. Tyma czasem w Laravelu jest odwrotnie.
Konstruktor kontrolera moze posiadac dowolne parametry i zostana one
wlasciwie przekazane.

Moje pytanie brzmi: jak w PHP napisac funkcje/metode, która bedzie
otrzymywala instancje obiektów takich jak podamy w parametrach wywolania?

Zobrazuje to. Mamy funkcje:

function x(klasa a) {}

Zwykle wywolujemy ta funkcje jako x(new classA());

A teraz odwracamy sytuacje i w funkcji deklarujemy co chcemy otrzymac, a
wywolanie funkcji ma byc z tym zgodne:

function x(niespodzianka a, niespodzianka2 b) {}

Jak zrobic to aby funkcja x przyjela dane zgodnie z lista parametrów?

Czyli chcialbym wykonac cos takiego (opisowo):

if (parametrFukcjiJestTypuNiespodzianka) p1=new niespodzianka();
if (parametr2FukcjiJestTypuNiespodzianka2) p2=new niespodzianka2();

x(p1,p2);
Wojciech Bancer (15.12.2018, 02:06)
On 2018-12-14, Marek S <precz> wrote:

[...]

> Czyli chciałbym wykonać coś takiego (opisowo):
> if (parametrFukcjiJestTypuNiespodzianka) p1=new niespodzianka();
> if (parametr2FukcjiJestTypuNiespodzianka2) p2=new niespodzianka2();
> x(p1,p2);






i ogólnie:
Marek S (16.12.2018, 00:26)
W dniu 2018-12-15 o 01:06, Wojciech Bancer pisze:

> i ogólnie:
>


Dzięki! :-)
Borys Pogorelo (16.12.2018, 13:31)
Dnia Sat, 15 Dec 2018 01:06:41 +0100, Wojciech Bancer napisal(a):

> i ogólnie:
>


Raczej chodzi po prostu o operator instanceof, bo chce inicjalizowac
obiekty.
Marek S (02.01.2019, 22:25)
W dniu 2018-12-16 o 12:31, Borys Pogorelo pisze:

> Raczej chodzi po prostu o operator instanceof, bo chce inicjalizowac
> obiekty.


Sadzisz, ze tak? Ja nie bardzo sobie wyobrazam jak wywolac funkcje i
przekazac jej parametry zgodnie z fantazja twórcy tejze funkcji.
Instanceof dziala post factum. Tymczasem typy argumentów trzeba znac
_ZANIM_ wywola sie dana funkcje.
Borys Pogorelo (02.01.2019, 23:18)
Dnia Wed, 2 Jan 2019 21:25:19 +0100, Marek S napisal(a):

> Sadzisz, ze tak? Ja nie bardzo sobie wyobrazam jak wywolac funkcje i
> przekazac jej parametry zgodnie z fantazja twórcy tejze funkcji.
> Instanceof dziala post factum. Tymczasem typy argumentów trzeba znac
> _ZANIM_ wywola sie dana funkcje.


To chyba normalne w kazdym normalnym [1] jezyku obslugujacym typowanie?

Jesli masz koniecznosc przekazania do funkcji róznego typu parametrów, to
nie definiuj typów. A jesli pracujesz z istniejacym kodem, to sie dostosuj
do interfejsu.

[1] niekoniecznie PHP, choc idzie ku lepszemu
Marek S (03.01.2019, 22:35)
W dniu 2019-01-02 o 22:18, Borys Pogorelo pisze:

>> Sadzisz, ze tak? Ja nie bardzo sobie wyobrazam jak wywolac funkcje i
>> przekazac jej parametry zgodnie z fantazja twórcy tejze funkcji.
>> Instanceof dziala post factum. Tymczasem typy argumentów trzeba znac
>> _ZANIM_ wywola sie dana funkcje.

> To chyba normalne w kazdym normalnym [1] jezyku obslugujacym typowanie?


Chyba sie nie rozumiemy. To moim zdaniem nie mocno nienormalne. Moze
opisze to czesciowo kodem. Piszemy klase framework i metode 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 dziedziczace w/w i nadpisujace metode 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 wymysla sobie
argumenty do funkcji a framework krakuje klasy potomne programisty w
celu wyluskania typów oczekiwanych argumentów i takie je przekazuje?
Borys Pogorelo (04.01.2019, 01:54)
Dnia Thu, 3 Jan 2019 21:35:21 +0100, Marek S napisal(a):

> Czy takie programowanie jest normalne, gdzie programista wymysla sobie
> argumenty do funkcji a framework krakuje klasy potomne programisty w
> celu wyluskania typów oczekiwanych argumentów i takie je przekazuje?


Przede wszystkim to nie jest dozwolone. Czy raczej: skonczy sie
ostrzezeniem, kod sie wykona, ale nie bez powodu otrzymasz to ostrzezenie.
Nie powinienes zmieniac deklaracji klasy z powodu mozliwosci stworzenia
takich wlasnie niespodzianek. Dozwolone jest co najwyzej rozszerzanie
deklaracji o nowe argumenty.

I chyba nadal nie przeczytales dokladnie jak dziala DI w Laravelu, bo caly
czas próbujesz na nowo wymyslic to, co jest podane na tacy.
Marek S (08.01.2019, 21:43)
W dniu 2019-01-04 o 00:54, Borys Pogorelo pisze:

> Przede wszystkim to nie jest dozwolone. Czy raczej: skonczy sie
> ostrzezeniem, kod sie wykona, ale nie bez powodu otrzymasz to ostrzezenie.
> Nie powinienes zmieniac deklaracji klasy z powodu mozliwosci stworzenia
> takich wlasnie niespodzianek. Dozwolone jest co najwyzej rozszerzanie
> deklaracji o nowe argumenty.


I o tym wlasnie pisze. Absurd sie wytworzyl.

Zrobilem test z uzyciem Reflections i dalo sie podobny algorytm wykonac
bez zadnych ostrzezen. Mozna dowolnie hakowac metody klas.

>I chyba nadal nie przeczytales dokladnie jak dziala DI w Laravelu, bo
> caly czas próbujesz na nowo wymyslic to, co jest podane na tacy.


Gdybym na te tace natrafil, to nie tworzylbym watku. Czytam dokumentacje
oficjalna:


a w niej dzial omawiajacy DI:
Marek S (08.01.2019, 21:47)
(przypadkiem wyslalo mi sie za wczesnie)

> a w niej dzial omawiajacy DI:


W innym watku próbowalem analizowac bezskutecznie zródla frameworka by
rozkminic to i owo skoro opisu na stronie producenta nie znalazlem.
Podobne wątki