Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Klasy i obiekty
Forum PHP.pl > Forum > Przedszkole
kamil1114
Czy ktoś mógłby mi wytłumaczyć w jakiś logiczny i zrozumiały sposób do czego służą klasy i obiekty ? Co zyskujemy korzystając z nich ? Czytam kursy o klasach i obiektach , ale dalej nie rozumiem o co chodzi. Proszę o wyjaśnienie i jakieś proste przykłady
benio101
Nie spamuj!
...
Ehh...
MateuszS
Benio101, przeciez autor napisal ze nic z kursow nie rozumie. To akurat nic dziwnego bo co jak co ale obiektowy w naszym polskim necie jest wytlumaczony tak ze sam autor kursu nie wie co napisal laugh.gif wacko.gif thumbsupsmileyanim.gif

Z racji ze sam zaczynam z OOP, nie chce Ci mącic. Polecam pisac, po trochu a z czasem (kilka dni) zrozumiesz o co chodzi w klasach i obiektach, choc to dopiero poczatek. Czytaj dalej kursy i staraj sie analizowac skrypty. To nic dziwnego ze nie rozumiesz o co chodzi, nikt w 10 min tego nie zrozumie.

Pozdrawiam i owocnej nauki
marcio
Cytat
Benio101, przeciez autor napisal ze nic z kursow nie rozumie. To akurat nic dziwnego bo co jak co ale obiektowy w naszym polskim necie jest wytlumaczony tak ze sam autor kursu nie wie co napisal

Buhahah chyba kursy z yoyo.pl zastanow sie zanim cos powiesz tez tak na poczatku myslalem i jest to bledne myslenie.

Kamil114 poczytaj o MVC wez jakis prosty FW Kohana lub jakis prywatny projekt przeanalizuj kod.
Sprobuj napisac cos sam byle co i pokaz to na forum a dowiesz sie co zle zrobiles to jest dobra droga do nauki.
kamil1114
Znalazłem taki kod:
  1. <?php
  2. class Klasa
  3. {
  4. function funkcja()
  5. {
  6. return 'a';
  7. }
  8. function inna($a)
  9. {
  10. return trim($a);
  11. }
  12. }
  13. $obiekt = new Klasa();
  14. echo $obiekt->funkcja();
  15. ?>


Powiedzcie mi tylko po co stosować klasy ? Wyczytałem gdzieś , że klasa to zbiór funkcji , ale przecież można też zrobić parę funkcji , więc po co przypisywać je do klasy ?
MateuszS
A no widzisz to jest dobre pytanie. Tez je zadawalem. W sumie masz racje, dla takich skryptow jak ten powyzej nie ma sensu pisac klasy. Bo ten skrypt mozna skrocic. Ale jezeli masz pisac cala duza strone to obiektowy to bardzo dobre rozwiazanie, te wszystkie wzorce projektowe, uniwersalnosc itd.

Napisali dlatego taki skrypt w obiektowym bo przeciez nie dadza Ci od razu calej strony do analizowania, chca zebys zrozumial jak wyglada OOP, podstawowe zagadnienia, napisal latwo przyklad takiej klasy.
kamil1114
Ale bez programowania obiektowego też można pisać strony i są dobre. Ciągle nie widzę zastosowania oob.
MateuszS
Są dobre, ale ciezej je zmodyfokowac. Zeby dodac jakas przydatna opcje musisz grzebac w kodzie. Sam jeszcze nie odkrylem magii OOP ale bez powodu wiekszosc stron w oop pisana nie jest. Wiec jakis sens musi w tym byc.
kamil1114
No właśnie , szukam tego sensu , bo dla mnie oop jest dość trudne i zastanawiam się czy jest sens się go uczyć , tym bardziej , że php znam całe , ale po trochu , nie umiem go tak super dobrze. Mysql też znam trochę.
MateuszS
Powiem tak, sam znam php na tyle na ile jest mi potrzebne. Jak czegos nie wiem, to szukam. Mysql to tyle ze umiem zapytania do bazy i w phpmyadminie ;D

Mysle ze nie trzeba znac az tak pro zeby pisac w oop bo tam z nowych rzeczy to dochodza tylko typowe dla oop pojecia praktycznie (klasa, obiekt, konstruktor, dziedziczenie itd.). Sam jeszcze nie napisalem nic duzego, mowia ze trzeba korzystac z wzorcow projektowych itd. Poczytaj o tym jak juz opanujesz podstawy OOP.

Zrob tak: nie mysl czy to potrzebne, ze mozna szybciej itd. ale napisz cos w OOP, cos najprostrzego co moze byc, tak jakbys sie od nowa jezyka uczyl, jakby php byl tylko obiektowy ;D np.

  1.  
  2. class kwadrat {
  3. public $bok;
  4. public $pole;
  5. function pole() {
  6. $this->pole=$this->bok*$this->bok;
  7. return $this->pole;
  8. }
  9.  
  10. }
  11.  
  12. $obKwadrat=new kwadrat();
  13. $obKwadrat->bok=5 // bok;
  14. echo $obKwadrat->pole();


Pisz podobne rzeczy. Z tego co mi mowia to nie wolno pisac w klasie HTMLa (tagow, znacznikow np .<a>, <p> itd, zawsze zwracaj wartosc w funkcji (return).
Quantum
  1. class kwadrat {
  2. public $bok;
  3. public $pole;
  4. function pole() {
  5. $this->pole=$this->bok*$this->bok;
  6. return $this->pole;
  7. }
  8.  
  9. }
  10.  
  11. $obKwadrat=new kwadrat();
  12. $obKwadrat->bok=5 // bok;
  13. echo $obKwadrat->pole();


Niepotrzebnie zadeklarowana zmienna $pole, bezsens nadawać jej akcesor publiczny i przypisywać wartość w przypadku gdy ją zwracasz, po co Ci dodatkowy dostęp przez $obKwadrat->pole ?

Wiem, że podałeś tylko przykład, ale lepiej uczyć kogoś od początku poprawnie używać OOP.

  1. class pole
  2. {
  3. public function kwadrat($bok)
  4. {
  5. return pow($bok, 2);
  6. }
  7.  
  8. public function prostokat($bok1, $bok2)
  9. {
  10. return $bok1*$bok2;
  11. }
  12.  
  13. public function szescian($bok)
  14. {
  15. return 6*pow($bok, 2);
  16. }
  17. }
  18.  
  19. class objetosc
  20. {
  21. public function szescian($bok)
  22. {
  23. return pow($bok, 3);
  24. }
  25. }
  26.  
  27. $pole = new pole;
  28. print $pole->kwadrat(6);
  29. print $pole->szescian(3);
  30. $objetosc = new objetosc;
  31. print $objetosc->szescian(4);


Klas nie tworzysz dla jednej funkcji, w tym przypadku podzielimy je na pole i objętość, a w niej metody dla poszczególnych figur geometrycznych.

Pozdrawiam smile.gif
MateuszS
czemu nie uzywasz wew klasy $this-> ?
marcio
Bo zmienne sa parametrami funkcji a nie polami danej klasy.
kamil1114
A czy umiałby mi ktoś wytłumaczyć do czego służy odwołanie $this. Czytam kursy , ale nie mogę tego zrozumieć. Po co to się stosuje i w jakich sytuacjach ?

Mam na przykład taki kod:
  1. <?php
  2. class pole{
  3.  
  4. function prostokat($a,$b){
  5. $pole=$a*$b;
  6. echo "$pole";
  7. }
  8.  
  9. function kwadrat($a){
  10. $pole=$a*$a;
  11. echo "$pole";
  12. }
  13.  
  14. function trojkat($a,$h){
  15. $pole=($a*$h)/2;
  16. echo "$pole";
  17. }
  18.  
  19.  
  20.  
  21. }
  22. $a=3;
  23. $b=4;
  24.  
  25.  
  26. $policz=new pole();
  27.  
  28. echo "Pole prostokata jest rowne:<br/>";
  29. $policz->prostokat($a,$b);
  30.  
  31. echo "<br/>A pole trojkata<br/>";
  32. $policz->trojkat($a,$h=5);
  33. ?>


I tutaj nie zastosowałem odwołania $this i wszystko działa.
shark121
$this używamy odwołując się do czegoś wewnątrz klasy. Chcąc zrobić coś ze zmienną/metodą wewnątrz klasy użyjesz $this->Metoda(); albo $this->Zmienna;

Poza klasą czyli jak już gdzieś się do niej odwołasz i będziesz miał na przykład $Klasa = new Klasa; i będziesz chciał się odwołać do tej samej zmiennej lub metody to napiszesz $Klasa->Metoda(); lub $Klasa->Zmienna;
kamil1114
Mniej , więcej rozumiem , ale czy bez utworzenia wcześniej referencji ($this) , można też się odwołać do zmiennej lub funkcji. Bo wydaje mi się , że ja się odwołałem do funkcji , a nie użyłem $this.

  1. <?php
  2. class pole{
  3.  
  4. function prostokat($a,$b){
  5. $pole=$a*$b;
  6. echo "$pole";
  7. }
  8.  
  9. function kwadrat($a){
  10. $pole=$a*$a;
  11. echo "$pole";
  12. }
  13.  
  14. function trojkat($a,$h){
  15. $pole=($a*$h)/2;
  16. echo "$pole";
  17. }
  18.  
  19.  
  20.  
  21. }
  22. $a=3;
  23. $b=4;
  24.  
  25.  
  26. $policz=new pole();
  27.  
  28. echo "Pole prostokata jest rowne:<br/>";
  29. $policz->prostokat($a,$b); //TUTAJ SIE ODWOLALEM
  30.  
  31. echo "<br/>A pole trojkata<br/>";
  32. $policz->trojkat($a,$h=5); // I TUTAJ
  33. ?>




Proszę o pomoc.
Smertius
$this używasz tylko wtedy kiedy odwołujesz się wewnątrz klasy do metod i zmiennych tej klasy. Np.
  1. class Pole
  2. {
  3. private $a=5;
  4. private $b=3;
  5. function oblicz_pole()
  6. {
  7. $wynik=$this->a*$this->b;
  8. return $wynik;
  9. }
  10. }
  11. $oblicz= new pole;
  12. $pole=$oblicz->oblicz_pole; //Zwróci wynik 15
kamil1114
Czyli nie zadziałało by takie coś:
  1. $wynik=$a*$b;
?
A czy na zewnątrz klasy też tego się używa ?
askone
Hej

Patrząc na Twe pierwsze próby z programowaniem obiektowym zauważyłem, iż kierujesz się w złą stronę... Uogólniając OOP polega na tym aby zamknąc w ramach klasy wlasciwosci i metody indywidualne dla danego obiektu... W Twoim przypadku kod klasy powinien wygladac tak:

  1. class Kwadrat {
  2. public $a;
  3.  
  4. public function pole()
  5. {
  6. $pole = $a * $a;
  7. echo $pole;
  8. }
  9. }
  10.  
  11. class Trojkat {
  12. public $a;
  13. public $h;
  14.  
  15. public function pole()
  16. {
  17. $pole = 0.5 * $a * $h;
  18. echo $pole;
  19. }
  20. }
  21.  


Oczywiście to tylko propozycja szkieletu, bo idąc dalej można by zdefiniowac klase abstrakcyjna Figura i po niej dziedziczyć powinny konkretne klasy Kwadrat, Prostokat, Trojkat...

Pozdrawiam
Smertius
Cytat(kamil1114 @ 1.11.2009, 19:14:39 ) *
Czyli nie zadziałało by takie coś: [PHP] pobierz, plaintext
  1. $wynik=$a*$b;
[PHP] pobierz, plaintext ?


Nie zadziała

Cytat(kamil1114 @ 1.11.2009, 19:14:39 ) *
A czy na zewnątrz klasy też tego się używa ?


Nie, $this używamy tylko wewnątrz klasy
kamil1114
Cytat(Smertius @ 1.11.2009, 19:21:07 ) *
Nie zadziała



Nie, $this używamy tylko wewnątrz klasy




Ale rozumiem , że to nie zadziała , ponieważ jest polecenie return , jeśli byłoby echo , które wyświetlało by wynik , to wszystko byłoby ok.
Smertius
Może źle się wyraziłem, spójrz na poniższy kod
  1. <?php
  2. class Kwadrat {
  3.  
  4. private $a=4;
  5.  
  6.  
  7.  
  8. public function pole()
  9.  
  10. {
  11. $a=0;
  12. $pole = $a * $a;
  13.  
  14. echo $pole;
  15.  
  16. }
  17.  
  18. }
  19. $obiekt=new Kwadrat;
  20. $obiekt->pole();
  21. ?>

Powyższy kod wyświetli na ekranie 0, bo odwołujesz się do zmiennej w $a zdeklarowanej w metodzie, a nie w klasie. Poniższy kod zwróci 16 bo odwołujesz się do zmiennej "klasowej", użycie return czy echo nie ma tu nic do znaczenia.
  1. <?php
  2. class Kwadrat {
  3.  
  4. private $a=4;
  5.  
  6.  
  7.  
  8. public function pole()
  9.  
  10. {
  11. $a=0;
  12. $pole = $this->a * $this->a;
  13.  
  14. echo $pole;
  15.  
  16. }
  17.  
  18. }
  19. $obiekt=new Kwadrat;
  20. $obiekt->pole();
  21. ?>
kamil1114
Teraz już rozumiem , dziękuję za pomoc. Jak się trochę poduczę OOP , to będę próbował przepisać mój skrypt dodawania i odczytywania newsów i komentarzy na OOP. Jakie są jeszcze ważne rzeczy, zagadnienia , które są niezbędne do programowania obiektowego. Domyślam się że konstruktor i destruktor , ale czy coś jeszcze. Nie za bardzo rozumiem do czego służy dziedziczenie i jak je wykorzystać.
MateuszS
Sam wiem ze dziedziczenie polega na jakby hmm kopiowaniu zawartosci jednej klasy do drugiej, tzn maja wspolne zmienne/metody (?). W sumie sam jestem ciekaw. Przyłączam się do pytania
Spawnm
klasa dziedzicząca może używać dóbr rodzica które są public i protect, jednak nie odnosi się do nich przez self lecz przez parent.
A temat zamykam bo wszystko jest w kursach i manualu...
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.