Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kilka pytań teoretycznych
Forum PHP.pl > Forum > PHP > Object-oriented programming
Ziels
Niedawo się przesiadłem na PHP5 i mam co do tego kilka wątpliwości:

1. W większości skryptów do operowania na zmiennych z klasy są metody setZmienna() getZmienna() - po co to robić skoro można prościej $obiek -> zmienna ?

2. Przy założeniu że jest to potrzebne to zamiast setek metod set() i get() można wyłapywać wszystko w __call() i __set() jednak nie widziałem w klasach takiego rozwiązania.

3. Interfejsy - służa one do czegoś oprócz 'wymuszania' zawarcia danych metod w klasie? Jeśli nie, to do czego one właściwie są, skoro można je oszukać wstawiając puste metody? Lepiej by było gdyby można było w nich zawrzeć jakieś instrukcje, wtedy nie trzeba by było tworzyć klasy w której by było upakowane wszystko a następnie kazać wszystkim innym dziedziczyć po niej.

4. Wyjątki - jest to wygodne, ale czym się one różnią w użyciu od die(); ? Tu i tu jest przerywane działanie skryptu więc teoretycznie mogę stworzyć funkcję exception($line, $file, $message); i używać jej ze stałymi __LINE__ i __FILE__

Jeśli ktoś mógłby rozjaśnić mi to co napisałem to byłbym wdzięczny smile.gif
Cysiaczek
Ja to widzę tak:

Cytat
1. W większości skryptów do operowania na zmiennych z klasy są metody setZmienna() getZmienna() - po co to robić skoro można prościej $obiek -> zmienna ?

2. Przy założeniu że jest to potrzebne to zamiast setek metod set() i get() można wyłapywać wszystko w __call() i __set() jednak nie widziałem w klasach takiego rozwiązania.


Można i tak i tak - tzn settery i gettery można jednak dodatkowo obudować o wywołania innych funkcji, modyfikowanie wartości. Można też np odmówić dostępu do zmiennej z jakichś przyczyn.
Osobiście wolę tradycyjne set i get niż funkcje magiczne - nie mam na razie do nich zaufania (ich działanie jest niekiedy dość tajemnicze). To też kwestia przyzwyczajenia.

Cytat
3. Interfejsy - służą one do czegoś oprócz 'wymuszania' zawarcia danych metod w klasie? Jeśli nie to czemu one służą skoro można je oszukać wstawiając puste metody? Lepiej by było gdyby można było w nich zawrzeć jakieś instrukcje, wtedy nie trzeba by było tworzyć klasy w której by było upakowane wszystko a następnie kazać wszystkim innym dziedziczyć po niej.


Interfejs wzbogaca klasę o dodatkowy typ. Np.
  1. <?php
  2. class A {}
  3. class B extends A implements executable,chainable {}
  4. $obiekt=new B();
  5. ?>


Obiekt B jest klasą typu B, A oraz executable i chainable. Można to wykorzystać do wymuszania typu obiektu.
Osobiście takie interfejsy planuję użyć do konfigurowania obiektów akcji ; p
Widzisz więc, że nie chodzi tylko o to, żeby wymusić metody. To co piszesz o upakowywaniu... od tego są klasy bazowe.
Popatrz na interfejs Iterator dostępny w php. Wymusz on metody
current()
key()
next()
rewind()
valid()

Widząc, że klasa implementuje taki interfejs wiesz, że takie metody możesz wywołać. Skoro takie metody są zawarte, to klasa może (ale nie musi, bo to zależy od intencji programisty) służyć do przeglądania czegoś.

Cytat
4. Wyjątki - jest to wygodne, ale czym się one różnią w użyciu od die(); ? Tu i tu jest przerywane działanie skryptu więc teoretycznie mogę stworzyć funkcję exception($line, $file, $message); i używać jej ze stałymi __LINE__ i __FILE__


Tym się różnią, że wyjątki nie muszą kończyć działania aplikacja jak robi to die(), czy exit(), tylko przerzucają wykonywany skrypt w inne miejsce, w którym możesz zadecydować. Przykład:
  1. <?php
  2. class A {
  3.  
  4. function test($file){
  5.  
  6. if (file_exists($file)){
  7. print 'ok'; //inne opreacje
  8. }
  9. else {
  10. throw new Exception('Brak pliku');
  11. }
  12. }
  13. function uprzejmaFunkcja(Exception $e){
  14. print "Nie było pliku, więc sie wykonałam<br /> aha - koleżanka test() dokładnie powiedziała powiedziała: <br />";
  15. print $e->getMessage().'<br />';
  16. print 'Teraz zapytam ją jeszcze raz, ale zmienię nazwę pliku';
  17. $this->test('innaNazwaPliku.txt'); // może się uda tongue.gif (uwaga - tu musi być osobny blok try-catch)
  18. }
  19. }
  20.  
  21.  
  22. $obj=new A();
  23. try {
  24. $obj->test('plikaa.txt');
  25. }
  26. catch (Exception $e){
  27. $obj->uprzejmaFunkcja($e);
  28. }
  29. ?>


Mam nadzieję, że pomogłem. Pozdrawiam. laugh.gif
Ziels
Nic dodać nic ująć, dzięki winksmiley.jpg
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.