Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [pytanie]php 6.0.0-DEV
Forum PHP.pl > Inne > Hydepark
Cysiaczek
Chciałbym zasięgnąć Waszej opinii na temat przesłaniania metod.
Problem napotkałem w wersji php 6.0.0-DEV (CVS)
Zdaje sobie sprawę, że jest to wersja deweloperska i wszystko w niej może ulec zmianie.

Na początek kod:
  1. <?php
  2. class A {
  3.  
  4. function test($foo){}
  5. }
  6.  
  7. class B extends A {
  8.  
  9. function test(){}
  10. }
  11.  
  12. $instance=new B();
  13.  
  14. // Fatal error: Declaration of B::test() must be compatible with that of A::test() in (...)
  15. ?>

Oczywiście powyższy kod działa w php 5 poprawnie i nie generuje żadnych błędów.

Zastanawiam się, czy to błąd, niedopracowanie, czy też czeka nas zmiana? Powyższy mechanizm jest dość często stosowany przez programistów. Czy taka zmiana jest logiczna? Macie jakieś pomysły?

Pozdrawiam.
tiraeth
Nie znam się za bardzo na OOP ale może stała protected pomoże ?
Cysiaczek
Protected niestety nie pomoże. Jedyny przypadek jaki działa, to ustawienie
  1. <?php
  2. class A {
  3. private function test(){}
  4. }
  5. ?>

Jednak wówczas dla klas potomnych ta metoda w ogóle nie istnieje, więc nie ma czego przesłaniać - jest deklarowana jako nowa metoda.
Ozzy
lista argumentów się nie zgadza
batman
@Ozzy ma rację. Z informacji, które udało mi się wygrzebać w necie (a nie było tego dużo - za wcześnie by podniecać się php 6 winksmiley.jpg ), można nadpisywać metody o takiej samej ilości parametrów. Jeśli ustawisz metodę jako prywatną, wówczas klasa potomna nie będzie mogła się do niej odwoływać i nie będzie konfliktu w parametrach.

Moim marzeniem jest możliwość deklarowania dowolnej ilości metod o takich samych nazwach, lecz różniących się parametrami winksmiley.jpg

Inną ciekawostką, którą znalazłem, jest to, iż utworzenie obiektu B, który dziedziczy po A, spowoduje wywołanie konstruktora z klasy A.
NoiseMc
Cytat
Moim marzeniem jest możliwość deklarowania dowolnej ilości metod o takich samych nazwach, lecz różniących się parametrami

Tak jak jest na przykład w C#, w php bardzo tego brakuje.
batman
Sporo ciekawych rzeczy jest w C# czy Javie. Może w php 7 się znajdą winksmiley.jpg
revyag
Cytat
Moim marzeniem jest możliwość deklarowania dowolnej ilości metod o takich samych nazwach, lecz różniących się parametrami
Cytat

Tak jak jest na przykład w C#, w php bardzo tego brakuje.


To żadna nowość, przeciążanie metod jest przecież w c++, więc nie wiem co się tak podniecacie że jest w c# czy javie snitch.gif
batman
Cytat
To żadna nowość, przeciążanie metod jest przecież w c++, więc nie wiem co się tak podniecacie że jest w c# czy javie


Wiem gdzie to występuje. A podniecać się będę, gdy zostanie to wprowadzone do php winksmiley.jpg
seaquest
Nie zostanie wprowadzone do php póki nie będzie kontroli nad typem zmiennej. Bo co - rozpoznawanie po samej ilości parametrów?
ikioloak
jest kontrola ale nie typow prostych, wiec brak przeciazania funkcji i metod jest conajmniej.. dziwne.
batman
Kontrola typów jest kolejnym "bajerem", którego mi brakuje w php. Czasami, aż krew mnie zalewa, gdy muszę poprawiać jakiś kod, w którym jest zmienna $numer, a w niej jakiś string lub co gorsza array.
NuLL
Cytat(batman @ 27.11.2006, 22:00:35 ) *
Kontrola typów jest kolejnym "bajerem", którego mi brakuje w php. Czasami, aż krew mnie zalewa, gdy muszę poprawiać jakiś kod, w którym jest zmienna $numer, a w niej jakiś string lub co gorsza array.

Ta nie zostanie nigdy wprowadzone - to jest wlasnie najwieksza sila php, ale dla wielu tez jego bolaczka winksmiley.jpg
Sh4dow
Panowie, MySQL nie zostanie nigdy taki jak ORACLE, a php nie bedzie nigdy jak C++ czy Java, dlaczego ? Bo to juz jest. Potrzebujesz cos innego to kozystaj z czegos innego, a nie marudz ze ci brakuje. To jest moze smutna prawda, ale jakże logiczna.
A jesli ktos nie radzi sobie z tym ze jakas zmienna nie jest stringiem tylko np. tablica to ... guitar.gif Aj Karrramba Rkingsmiley.png
batman
Cytat
A jesli ktos nie radzi sobie z tym ze jakas zmienna nie jest stringiem tylko np. tablica to ...


Pisząc jakąś aplikację w kilka osób nie masz możliwości zapanować nad jej wszystkimi elementami. Widzisz zmienną $number, więc zakładasz, że jest tam wartość liczbowa. Owszem można sprawdzać co tam jest, ale to kolejne wiersze kodu, nie mające nic wspólnego z logiką.

Cytat
Potrzebujesz cos innego to kozystaj z czegos innego, a nie marudz ze ci brakuje.


Będę marudził, ponieważ "stronek" nie napiszę w C++. Zaraz ktoś napisze jak to nie? Przecież ten język....... Ale php jest do tego stworzony i nie ma sensu kombinować z innym językiem tongue.gif
Cysiaczek
Po co zatem interfejsy, metody abstrakcyjne? Przecież to właśnie one w takich sytuacjach sprawdzają się znakomicie.
Taki kod:
  1. <?php
  2. //class A jak wyżej.
  3.  
  4. class B extends A {
  5. function test(){
  6. parent::test($foo);
  7. //dalsze operacje
  8. }
  9. }
  10. ?>


Daje dość spore możliwości dotyczące np filtracji danych, czy testowania. Wydaje mi się, że wymuszanie powtórzenia argumentów jest zbędne, bo tą rolę pełnią interfejsy.

@batman
Cytat
za wcześnie by podniecać się php 6

Może i wcześnie, ale wolę już teraz pomału przygotowywać aplikacje w php5 tak, aby potem można je w miarę bezboleśnie wdrożyć w php6 guitar.gif Dobrze jest wiedzieć, co może nas spotkać : )

Pozdrawiam.
hwao
Aby wiedzieć co się ma w zmiennych używa się dokumentacji - komentowania kodu - i problem znika. Druga sprawa, tablice i obiekty można wymusić, więc pozostają w sumie tylko zmienne "płaskie"
batman
Cytat
Może i wcześnie, ale wolę już teraz pomału przygotowywać aplikacje w php5 tak, aby potem można je w miarę bezboleśnie wdrożyć w php6 guitar.gif Dobrze jest wiedzieć, co może nas spotkać : )


Wersja 6 zmieni się jeszcze tyle razy, że pisanie aplikacji pod kątem niejasnej przeszłości wydaje mi się bez sensu.

Cytat
Aby wiedzieć co się ma w zmiennych używa się dokumentacji - komentowania kodu - i problem znika. Druga sprawa, tablice i obiekty można wymusić, więc pozostają w sumie tylko zmienne "płaskie"


A co jeśli w dokumentacji mam napisane, że $number zawiera liczbę, a jakiś programista zostawił mi niespodziankę w postaci tablicy?
UDAT
Cytat(batman @ 28.11.2006, 14:53:45 ) *
Wersja 6 zmieni się jeszcze tyle razy, że pisanie aplikacji pod kątem niejasnej przeszłości wydaje mi się bez sensu.
A co jeśli w dokumentacji mam napisane, że $number zawiera liczbę, a jakiś programista zostawił mi niespodziankę w postaci tablicy?

Wywalasz wyjątek.
Robisz konwersję do domyślnej wartości, itp.

Cytat
Potrzebujesz cos innego to kozystaj z czegos innego, a nie marudz ze ci brakuje.

Jeśli tak bardzo potrzebujesz dorób sobie rozszerzenie do php'a, zmodyfikuj interpreter, albo w ostateczności zrób tak jak ja, czyli napisz własną obsługę przeciążania napisaną jako klasa php (w prostych zastosowaniach jest to dobre, jednak odnotowałem ok. 40% spadek wydajności).

Cytat
Po co zatem interfejsy, metody abstrakcyjne? Przecież to właśnie one w takich sytuacjach sprawdzają się znakomicie.

A pomyśl o innym programiście który ogląda taki kod. Krótkie skakanie po interfejsach, wcześniej zapewne po łańczuszku klas rozszerzanych dla zmniejszenia czasu pisania o 5s ( zresztą możesz przekopiować CTRL+C CTRL+V)
batman
Cytat
...napisz własną obsługę przeciążania napisaną jako klasa php (w prostych zastosowaniach jest to dobre, jednak odnotowałem ok. 40% spadek wydajności).


Spadek wydajności o 40%? Raczej mało atrakcyjna alternatywa.

Cytat
Wywalasz wyjątek.
Robisz konwersję do domyślnej wartości, itp.


I tak robię teraz. Jednak znacznie lepiej byłoby przechwycić wyjątek, niż go wygenerować, a potem przechwycić.
UDAT
Cytat(batman @ 28.11.2006, 17:53:05 ) *
Spadek wydajności o 40%? Raczej mało atrakcyjna alternatywa.

40% to spadek wydajności wywoływania metod przeciążonych w porównaniu do normalnego wywoływania, nie całej aplikacjii.
batman
I tak mało atrakcyjna alternatywa.

W niektórych przypadkach jest to nie do pomyślenia.
UDAT
Cytat
I tak robię teraz. Jednak znacznie lepiej byłoby przechwycić wyjątek, niż go wygenerować, a potem przechwycić.


To ty sam do swoich metod w swoich klasach przesyłasz złe dane??

Cytat
I tak mało atrakcyjna alternatywa.
W niektórych przypadkach jest to nie do pomyślenia.

Czy ja wiem??
U mnie php jest w stanie w czasie 1s wywołać 200 000 metod typu $obj->method(), a z przeciążaniem 120 000.
Wspomniana metoda jest pusta.

U mnie w dość sporym ( 1MB kodu ) projekcie wywoływań jest ok. 2 500 / request. 90% z tego nie wymaga przeciążania ( gettery i __settery ). Tak więc mam wywołać 250 wolniejszych funkcji, co sprawi że skrypt spowalnia o jakieś 0.000 2 s co jest chyba dopuszczalne.
batman
Cytat
To ty sam do swoich metod w swoich klasach przesyłasz złe dane??


Napiszę jeszcze raz:
A co jeśli w dokumentacji mam napisane, że $number zawiera liczbę, a jakiś programista zostawił mi niespodziankę w postaci tablicy?

Cytat
Czy ja wiem??
U mnie php jest w stanie w czasie 1s wywołać 200 000 metod typu $obj->method(), a z przeciążaniem 120 000.
Wspomniana metoda jest pusta.

U mnie w dość sporym ( 1MB kodu ) projekcie wywoływań jest ok. 2 500 / request. 90% z tego nie wymaga przeciążania ( gettery i __settery ). Tak więc mam wywołać 250 wolniejszych funkcji, co sprawi że skrypt spowalnia o jakieś 0.000 2 s co jest chyba dopuszczalne.


Jeśli piszesz aplikację, która z założenia ma działać "trochę" gorzej niż inne, to już wolę ponarzekać na brak kontroli typów winksmiley.jpg Czasami te ułamki sekund potrafią uzbierać się w spore opóźnienia.
Sh4dow
Cytat(batman @ 28.11.2006, 21:15:36 ) *
Napiszę jeszcze raz:
A co jeśli w dokumentacji mam napisane, że $number zawiera liczbę, a jakiś programista zostawił mi niespodziankę w postaci tablicy?
...

Sorki ze sie czepiam, ale jesli działasz z wieloma deweloperami to raczej trzeba być przygotowany na takie rzeczy ze moze byc jakiś błąd podczas rozwoju i moze byc przekazane dane których sie nie spodziewasz wiec powinienes raczej zrobic tak zebys został o tym powiadomiony a nie zebyc oczekiwał nieoczekiwanego. Oczywiscie ze kontrola typu danych zalatwila by to, ale jesli nie ma tego to trzeba by o to zadbac troche guitar.gif
batman
I tak też robię. Chodzi mi o to, że kontrola typów byłaby doskonałym udogodnieniem.
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.