Ziomus nie rozumiem jednego: Dlaczego nie wytlumaczyles czym jest metoda call a chcesz na sile pokazac jej dzialanie strasznie nieczytelnym kodem. Nikt nie ma kompilatora w mozgu i nikt tego kodu nie przeanalizuje w sekunde. Duzo lepszym rozwiazaniem byloby pare zdan na temat tego czym jest ta metoda i do czego jej uzywac. Ludzie ktorzy ucza sie na przykladowym kodzie lub uwazaja ze jest to dobrym rozwiazaniem nie maja pojecia o procesach potrzebnych do utrwalania wiedzy.
Po pierwsze zwieksz mase.
Po drugie przykladowy kod nie jest do analizowania tylko ma sluzyc jako podstawa do dalszej przerobki.
Po trzecie analizujac kod NIE UCZYMY SIE! Dopiero przerabiajac dany kod UTRWALAMY wiedze.
Po czwarte uczymy sie czytajac tekst zrozumialy dla ludzi jak dokumentacja przykladowo.
Po piate daruj sobie prowadzenie tej szkolki niedzielnej wyciagajacej kase od naiwnych. Sam nie znalem metody call ale to dlatego ze nigdy w zyciu nie byla mi potrzebna. Teraz juz ja znam i uwazam ze dalej nie jest mi potrzebna i nic to nie zmienia w moim paruletnim doswiadczeniu samoucznym.
Tak wogole to wiem czym jest metoda call bo sie domyslilem bo nie pierwszy dzien obcuje z programowaniem. Niestety kompletnie nie rozumiem nadal tego przykladu ktory podales i nie wplynal on na moja wiedze. Jedyne co mi pomoglo to "uzywanie metody ktora nie istnieje - call" i po tym wyciagnalem wszystko.
Piss and pozdro.
W skrócie. Cały art można było sprowadzić do jednego zdania.
"Metoda magiczna __call() jest wywoływana w momencie gdy użytkownik spróbuje wywołać nieistniejącą metodę."
To by było na tyle. __call() to chory wymysł kogoś komu nie chciało się wprowadzać przeciążania w PHP. Parę lat piszę w tym języku i jeszcze nie trafiła mi się sytuacja gdy jest sens ją używać. Pomijam to że jej wywołanie trwa znacznie dłużej niż w wypadku zwykłej metody obiektu.
W skrócie to można było napisać "kupcie szkolenie reklamowane na końcu, JUŻ JUŻ SCHNELLER".
Perfidny spam.

Call i wszystkie metody magiczne to nawet nie namiastka przeciążania. Żeby funkcję przeciążać, musi ona już wcześniej istnieć i być nieco inna: mieć inny typ przyjmowanych parametrów, inną liczbę parametrów. __call to tylko taki "hack" by móc obsłużyć coś, czego nie ma - w razie czego. Na dodatek jak wspomniał Dariusz P. - strasznie wolna. Tak jak wszystkie magiczne metody.
@Autor:
Sorry autor 10 lat doświadczenia w developerce (praca a nie "robienie szkoleń")... tego, że to "prosty" przykład po prostu nie skomentuję... chociaż nie. Idiotyczny, nieczytelny, wygląda jak sklecony z kilku źródeł przez 14 latka, który nie wie jak cokolwiek działa (kopiuj wklej).
Gdyby ktoś mi w firmie takiego potworka "sklecił" to następnego dnia bym gadał z szefem i by wyleciał na zbity pysk. Co NIGDY się nie zdarzyło i jeśli chodzi o błędy w kodzie to jestem bardzo tolerancyjny. Po prostu w pewnych wypadkach nie ma nadziei. Jeśli to "prosty przykład na działanie funkcji" - to właśnie mamy do czynienia z takim wypadkiem.
Artykuł nie pokazuje kompletnie NIC. Stek głupot i odwołań do zagnieżdżonych tablic. To jest najgorsze. Złe zaprojektowanie klas, przekazywanie parametrów w wielokrotnie zagnieżdżonych tablicach... cały ten syf zaciemnia przykład. 2 linijki przykładu i 100 linii syfu.
Ja bym chciał zobaczyć jak na tym szkoleniu wygląda kod który cokolwiek ROBI.
public function __call($n, $p)
Serio komukolwiek to cokolwiek mówi, zanim nie wytłumaczysz? Chowasz paramerty ($p) gdzieś między kolejnymi (idiotycznymi) wywołaniami return z zagnieżdżonymi tablicami.
Nigdy bym się nie podjął uczenia nikogo czegokolwiek. Ty się za to kompletnie minąłeś z powołaniem. Zamiast upraszczać, wmawiasz kursantom, że uczysz jakiejś "magii". Totalnie złe praktyki programistyczne, nieumiejętność zaprojektowania prostego przykładu, dla banalnej funkcji z 2 argumentami.
class licznik
{
private $stan;
function __construct()
{
$this->stan = 0;
}
function __call($nazwa, $argumenty)
{
switch ($nazwa)
{
case 'plus':
$this->stan++;
break;
case 'minus':
$this->stan--;
break;
case 'ustaw':
$this->stan = $argumenty[0];
break;
}
}
function wypisz()
{
echo $this->stan.'';
}
}
$licz = new licznik();
$licz->plus();
$licz->wypisz();
$licz->minus();
$licz->wypisz();
$licz->ustaw(10);
$licz->wypisz();
Nie prościej tak? Zamiast jakichś random'ów, skopanej sprzedaży i innych bzdur?
Jak mam 2 jabłka i sprzedam 3 to będę miał -1 jabłka. Wywołanie sprzedaj z wartością ujemną => sprzedaj -2 jabłka. Serio jak na to wpadłeś? Bo dzieciaki w gimnazjum piszą lepszy kod.
Serio przemyśl te przykłady, zleć komuś jak nie umiesz. Bo jak ktoś z choćby rokiem doświadczenia na to spojrzy to cię (słusznie) wyśmieje!
hah zownowales tamten przyklad maksymalnie :D. Pierwsze sensowne wytlumaczenie dzialanie tej funkcji przy czym i tak nieoplacalne w tym wypadku wykonania. Cos czuje ze ciezko jest wymyslic cos sensownego i prostego zastosowania dla tej funkcji...

@Dariusz P.: Ja mówię o faktycznym przeciążaniu, czyli
funkcja jakas($par1) {return 'ble';}
funkcja jakas($par1, $par2) {return 'ble2;}
PHP na to nie pozwala.
Trzeba tworzyć protezy w stylu:
1)wariant z kombinowaniem długiej listy parametrów jawnie w metodzie:
funkcja jakas($par1, $par2=false) {
if($par2) {
return 'ble2';
} else {
return 'ble';
}
}
2) posłużenie się func_get_args (to jest to o czym piszesz)
Tylko czy to ma sens? Gdy wejdzie tak przez programistów (doświadczonych) oczekiwane wymuszenie typu parametru funkcji poprzez jego jawne umieszczenie przed nazwą parametru to co będzie? Z tym drugim wariantem nastąpi takie zagnieżdżenie warunków sprawdzających, switchy, że aż głowa rozbolałaby :D


© 1998-2026 Dziennik Internautów Sp. z o.o.