Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP4]&[OOP] Jak przeciazac metody ?
Forum PHP.pl > Forum > PHP
Yacho
Czy w PHP4 mozna przeciazac metody ? (chodzi o rozne warianty funkcji w zaleznosci od podanych parametrów...) jesli tak to jak to jest realizowane ?
Pigula
przeciazenie funkcji chyba nie jest mozliwe tak jak ma to miejsce w np. c++ mozesz zrobic cos takiego:
  1. <?php
  2. function jakas_funkcja($arg)
  3. {
  4. if (is_int($arg))
  5. {
  6. //cos sie wykonuje
  7. }
  8. elseif (is_array($arg))
  9. {
  10. //cos innego sei wykonuje
  11. }
  12. //itd
  13. }
  14. ?>

tylko to mi przyszlo na mysl. mozesz oczywiscie kilka miec argumentow co zwiekszy ilosc kombinacji.
-------------
Edit: jest to troche sztuczne ale pomaga przy konstruktorze jak musisz go przeciazyc.
Yacho
no wlasnie... problem tylko w tym ze to srednio czytelne rozwiazanie jest

chodzi o to ze chce miec funkcje do robienia miniatur.... jesli user poda sciezke pliku wyjsciowego to idzie na plik wyjsciowy - jesli nie to zwraca na domyslne wyjscie (wysyla header i stream) w sumie przeciazanie by sie tu najbardziej przydalo :/
Sh4dow
jasne światło mnie otoczyło i głos manuala rzekł overload

guitar.gif Rkingsmiley.png
Yacho
Cytat(Sh4dow @ 2006-03-07 17:45:47)
jasne światło mnie otoczyło i głos manuala rzekł overload

guitar.gif  Rkingsmiley.png

nietety ktoś przeslonił poł reflektora łapą tongue.gif

Cytat
Ponieważ jest to rozszerzenie eksperymentalne, nie wszystko działa. Brakuje aktualnie wsparcia dla __call(), można przeciążać tylko operacje pobierania i ustawiania właściwości obiektu. Nie można także wołać funkcji obsługi przeciążania jak normalnych metod istniejących w klasie, a __set() działa tylko do jednego poziomu dostępu do właściwości.


kompletnie nie rozumiem tych przykladow....

chce miec cos w stylu
  1. <?php 
  2. function mojafunkcja($arg1,$arg2)
  3. {
  4. // tu cos robimy
  5. }
  6. function mojafunkcja($arg1,$arg2, $arg3)
  7. {
  8. // tu cos robimy cos innego poniewaz podano $arg3
  9. }
  10.  
  11. ?>


niestety - przykladu z manuala ni cholery nie moge odniesc do tego o co mi chodzi..... oooo i znalazlem dlaczego - cytat z komentarza manuala.... :
Cytat
While this is a nice Feature it has nothing to do with Overloading as it is known in other OO-Languages.
What this feature does is allowing the dynamic addition of instance variables as e.g in Python.
Overloading means defining several methods with the same name in a single class. Which method will be called depends on the number and type of arguments specified. With dynamic and weak typed languages (like php) this can  of course not work.
NetJaro
A ja mam pytanie - po co się przeciąża metody? Jakie jest tego zastosowanie?
Yacho
hymm
przytocze Ci 2 przyklady :
pierwszy - piszesz program do mnożenia dwóch składników przez siebie - gdzie skladnik moze byc albo liczbą albo macierzą...

wiec musisz zobaczyc czy pobrane A i B as macierzami czy intami nastepnie napisac metody Mnoz_maciez() i mnoż_calkowita() w zaleznosci od tego jakiego typu sa pobrane zmienne...

Natomiast jesli mozesz korzystac z przeciazania (co okazalo sie w PHP4 niemozliwe) to :

piszesz metode mnoz w mniej wieej taki sposob (kod poglądowy) :
  1. <?php
  2.  
  3. function Mnozenie($maciezA, $macierzB) // tu argumenty sa typu Macierz (!)
  4. {
  5. // tu algorytm mnozenia macierzy
  6.  
  7. }
  8. function Mnozenie($calkowiteA, $calkowiteB)
  9. {
  10. // tu algorytm mnozenia calkowitych
  11. }
  12.  
  13. ?>


teraz starczy ze wywolasz metode mnozenie($podaneA, $podanB) kompilator sam powinien rozpoznac typy zmiennych - jesli beda to macierze to wywola algorytm dla macierzy - jesli integery - bedzie algorytm dla intów

Jak wlasnie pisalem dobrym przykladem jest tworzenie miniaturek - czaem potrzebujemy zeby skrypt zapisal nam plik jpg gdzies na dysku (wtedy podajemy go w sciezce docelowej) czasem potrzebujemy by tylko "wywalil go na ekran" zeby wstawic w tag <img>

moglibysmy skostruowac takie przeciazenie metody Miniatura():
  1. <?php
  2. function Miniatura($sciezka _do_zdjecia,$szerokosc)
  3. {
  4. // tu nie podano docelowego pliku dla miniatury - znaczy mamy ja wywalic na ekran
  5. }
  6. function Miniatura($sciezka _do_zdjecia,$szerokosc,$sciezka_docelowa)
  7. {
  8. // mamy inny zestaw parametrow wiec wykonujemy inna akcje - tu generowanie miniatury + zapis jej do pliku
  9. }
  10.  
  11. ?>


Jak widac na ponizszym przykladzie jest to tworzenie jakby "alternatywnych wersji" metod o tych samych nazwach - w zaleznosci od parametrow metody (nie tylko od ich typu ale także ilosci !) wywoływana jest odpowiednia metoda.... glownym powodem dla ktorego w php nie ma przeciazania jest to ze typy zmiennych sa slabo akcentowane - jednakze myslalem ze metody mozna przeładować korzystając z ilosci podawanych do nich parametrów....
dr_bonzo
Yacho - nie da sie tak:
  1. <?php
  2. function Mnozenie($maciezA, $macierzB) // tu argumenty sa typu Macierz (!)
  3. {
  4. // tu algorytm mnozenia macierzy
  5.  
  6. }
  7. function Mnozenie($calkowiteA, $calkowiteB)
  8. {
  9. // tu algorytm mnozenia calkowitych
  10. }
  11. ?>


Mozesz uzyc func_args() czy jakos tak i wybierac metode wg. listy parametrow.


Ale w twoim przypadku rozbij to min. 2 funkcje: na generowanie pliku graficznego i jego zapis do pliku lub wyswietlenie.
Vengeance
  1. <?php
  2.  
  3. function Miniatura($sciezka _do_zdjecia,$szerokosc,$sciezka_docelowa=null)
  4. {
  5.    //...
  6.    if(!is_null($sciezka_docelowa))
  7.       // zapisz
  8.    else
  9.       echo obrazek;
  10. }
  11.  
  12. ?>


----------
Oj, nieladnie -- musialem poprawic bbcode smile.gif
-- dr_bonzo
Yacho
przeciez napisalem ze to kod przykladowy tongue.gif czytaj cale posty tongue.gif akurat ten przyklad overloadingu jest zywcem z Javy wyciagniety jak juz zdażylem wyszperac i jak powedziales - w php sie nie da. NetJaro chcial zebym zilustrował mechanizm - mysle ze udalo sie zaprezentowac o co chodzi.....

Zastosuje metode jaka Vee podał jednak nie podoba mi sie to - z przeciazeniem byloby o tyle prosciej i czytelniej (chlip)
tes
Czy w php da się przeładowywać konstruktor ?
Bo mi to nie wychodzi, a z ifami to biednie wygląda :/
Aha... chodzi mi o PHP5, nie chciałem nowego tematu zakładać smile.gif
hwao
nie da sie, poniewaz w php nie ma typow zmiennych narzuconych
athabus
w php5 jest cos takiego jak __call() ale tez srednio sie spisuje. Jak ify byly tak sa niestety.
W php chyba dlugo nie bedzie mozna przeciazac metod bo
a)brak scislej kontroli typow (choc w php5 juz w obiektach mozna w ograniczony sposob kontrolowac typy)
b)php ma zaimplementowane argumenty opcjonalne w funkcjach/metodach (w przeciwienstwie np do c#) przez co przeciazanie realizuje sie niejako automatyczie

Nie wiem jak wam, ale mi strasznie brakuje przeciazania z prawdziwego zdarzenia. Moze w php6...
tes
Cytat(hwao @ 2006-03-08 07:44:35)
nie da sie, poniewaz w php nie ma typow zmiennych narzuconych

Czyli zostają mi warunki ? sad.gif
Szkoda... a do pewnego momentu tak się przyjemnie pisało...
sobstel
mogą się także przydać funkcję func_get_arg, func_get_args i func_num_args
Yacho
Cytat(athabus @ 2006-03-08 10:55:53)
Nie wiem jak wam, ale mi strasznie brakuje przeciazania z prawdziwego zdarzenia. Moze w php6...

oby ! w php ostatnio OOP sie niby tak upowszechnia i wszyscy zachwalaja je jako jedyne wlasciwe podejscie a nie ma jeszcze kompletu narzedzi do stosowania.... btw. (zalozylem ten temat w przedszkolu bo moje pojecie o php w sumie jest jeszcze nie takie jak bym chcial - wywiazala sie z tego calkiem fajna dyskusja - az sie zdziwilem... smile.gif ) jeszcze raz dzieki wszystkim za pomoc smile.gif
hwao
w php6 nie bedzie, prawdopodobnie.

dlamnie nie potrzebne wogole jest tego typu przeciaznie metod w php, bo poco? w innych jezykach jest to poprostu wygodniejsze w php nie zachodzi taka potrzeba.
Arrow
Cytat(Yacho @ 2006-03-07 18:11:56)
no wlasnie... problem tylko w tym ze to srednio czytelne rozwiazanie jest

chodzi o to ze chce miec funkcje do robienia miniatur.... jesli user poda sciezke pliku wyjsciowego to idzie na plik wyjsciowy - jesli nie to zwraca na domyslne wyjscie (wysyla header i stream) w sumie przeciazanie by sie tu najbardziej przydalo :/

witam, a nie wystarczy tak:

  1. <?php
  2.  
  3. function zrob_miniaturke($wyjscie='header')
  4. {
  5.  
  6. }
  7.  
  8. //wywolanie
  9.  
  10. zrob_miniaturke(); //standard
  11. zrob_miniaturke('./galeria/0306/miniaturka_1.jpg'); //ze sciezka
  12.  
  13. ?>



najprosciej chyba ... :]
Yacho
no tak oczywiscie ale po co komplikowac ? zauwaz ze masz tam jedna zmienna ktora jest w sumie potrzebna do .... niczego - kwestia taka czy jest to na tyle przejrzysta konstrukcja ze za 2 miesiace spojrzysz na ko i bedziesz wiedziec o co chodzi - bo ze to mozna zrobic to wiadomo - kwestia zeby zrobic to jak najlepiej smile.gif

Cytat
w php6 nie bedzie, prawdopodobnie.

dlamnie nie potrzebne wogole jest tego typu przeciaznie metod w php, bo poco? w innych jezykach jest to poprostu wygodniejsze w php nie zachodzi taka potrzeba.


Ja obserwuje taka tendencje ze niektorzy ludzie na sile proboja udowodnic co mozna a co nie mozna w php - i stosuje sie wymyslne wzorce projektowe modele typu MVC i inne - ale nie wiem czy uciekanie sie do tych metod jest w 100% slusznym zalozeniem - php nie jest takim jezykem jak java czy dotnety - wiec pewne konstrukcje nie maja w nim zastosowania i w niektore rzeczy nie powinno sie pakowac - a jesli juz mamy sie pakowac powinnismy miec komplet narzedzi do tego...

dobra sorry za OT - temat mozna uznac za zakonczony smile.gif
tes
Cytat(hwao @ 2006-03-08 15:00:50)
dlamnie nie potrzebne wogole jest tego typu przeciaznie metod w php, bo poco? w innych jezykach jest to poprostu wygodniejsze w php nie zachodzi taka potrzeba.

Wygodniejsze to mało powiedziane. I robi różnicę ;]
Akurat imo przeciążanie konstruktora to bardzo przydatna sprawa. Inne metody to mi tam rybka.
mike
Cytat(tes @ 2006-03-08 20:35:04)
Akurat imo przeciążanie konstruktora to bardzo przydatna sprawa.

Podaj przykład, który pomoże Ci w php.
Bo ja jestem bliski poglądu jaki ma ~hwao
tes
Za mało klepię w php żeby ci tu jakiś super przykład wymodzić, ale na siłę(biggrin.gif) proszę:
Masz jakąś klasę użytkownik. Uzytkownik posiada wiele pól (imie, nazwisko itd...) Wszystkie informacje o użytkowniku przechowywane są w bazie danych.
Aby zainicjalizować pola chcę używać konstruktora (dość wygodne moim zdaniem tongue.gif).
No i teraz przypuścmy iż przewidujesz tworzenie (obiektu) użytkownika posiadając jego id, login+pass (potrzebne np. przy logowaniu), czy też imię+nazwisko+id.
Normalnie tworzysz 3 konstruktory, przeciążasz i inicjalizujesz elegancko swoje pola w jaki sposób sobie zamarzysz.
A tak to if ifa ifem pogania sad.gif
Oczywiście są inne metody wybrnięcia z tego, ale sporo konstruktorów już przeciążyłem smile.gif i naprawdę ułatwia to pracę, co nie znaczy że jest niezastąpione.

Pozdrawiam.
LBO
dla mnie bez sensu... wole juz zrobic factory jakis... lub ewentualnie kilka dodatkowych metod do wyciagania uzytkownika.. if'y w logice palikacji a nie konstruktorze.. bardziej czytelne wtedy..
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.