Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Podstawy OOP
Forum PHP.pl > Forum > Przedszkole
in5ane
Cześć, otóż zacząłem sobie przyswajać czyste OOP w PHP. Wcześniej wiele pisałem już we frameworkach kod obiektowy, jednakże nigdy nie pisałem własnej klasy, ani dokładniej nie zagłębiałem się w sposób działania klas oraz ich obiektów. Z palca napisałem malutką klasę, czy ktoś może zerknąć i powiedzieć mi, czy dobrze rozumuję zasady działania programowania obiektowego i czy w miarę dobrym stylu piszę? Oczywiście pomijam MVC - oddzielanie widoku tutaj od zarządzania całą resztą. Proszę o konstruktywną opinię. W końcu człowiek musi zacząć programować własne aplikacje pisząc je w stylu obiektowym (pomijam frameworki). Poniżej prezentuję swój kod:
  1. <?php
  2. class Article
  3. {
  4. public $id;
  5. private $title;
  6. private $content;
  7. private $author;
  8. private $comment;
  9.  
  10. public function showArticle()
  11. {
  12. /* Reference to MySQL to receive information */
  13. return $this->id;
  14. }
  15. public function deleteArticle()
  16. {
  17. /* Reference to MySQL and delete article in MySQL */
  18. if (1 == 1)
  19. return true;
  20. else
  21. return false;
  22. }
  23. public function addArticle($title, $content)
  24. {
  25. /* Security input variables and adding the article to MySQL */
  26. return rand(); // Return added article ID, for example used rand() function
  27. }
  28. public function commentArticle($author, $comment)
  29. {
  30. /* Security input variables and adding the article to MySQL */
  31. $article_id = $this->id;
  32. // For example: 'INSERT INTO comments VALUES ('', '$author', '$comment', $article_id)'
  33. }
  34. }
  35.  
  36. $oArticle = new Article();
  37. if (isset($_GET['id']))
  38. {
  39. $oArticle->id = $_GET['id'];
  40. echo 'Artykul o ID: '.$oArticle->showArticle().' - <a href="?id='.$_GET['id'].'&delete=true">usun</a>';
  41. if (isset($_GET['delete']) && $_GET['delete'] == 'true')
  42. {
  43. echo '<br /><br />';
  44. if ($oArticle->deleteArticle() == true)
  45. echo 'Artykul usuniety';
  46. else
  47. echo 'Blad';
  48. }
  49. }
  50. else
  51. {
  52. echo 'Dodaj nowy artykul:<br />$title = \'Testowy artykul\';<br />$content = \'tresc... tresc... tresc... tresc... tresc... tresc... tresc... tresc... tresc...\';<br /><br />';
  53. $title = 'Testowy artykul';
  54. $content = 'tresc... tresc... tresc... tresc... tresc... tresc... tresc... tresc... tresc...';
  55. echo $oArticle->addArticle($title, $content);
  56. }
  57. ?>
b4rt3kk
Może to kwestia zbyt małej ilości krwi w alkoholu, ale ta Twoja klasa nie ma najmniejszego sensu. W jakim celu deklarujesz obiekty skoro ich nawet nie używasz? Sama klasa jest bezużyteczna, tak samo jak jej metody.
redeemer
Dodatkowo XSS.
in5ane
Proszę o nakierowanie kolego b4rt3kk. A co do XSS to przecież nic nie zabezpieczałem w tym skrypcie.
b4rt3kk
To są Twoje obiekty:

  1. public $id;
  2. private $title;
  3. private $content;
  4. private $author;
  5. private $comment;


Będą one dostępne wewnątrz metod klasy (i do tego służą), tyle że nie nadajesz im żadnych wartości. Dzieje się to chociażby w ten sposób:

  1. function setTitle($title) {
  2. $this -> title = $title;
  3. }


Możesz to robić również w konstruktorze, zależy od potrzeb. Teraz obiekt $title ma nadaną wartość i można go użyć w innych metodach, np.

  1. function addArticle() {
  2. $query = "INSERT INTO articles VALUES ('$this -> title')"; // przykładowe zapytanie
  3. }


A jaki ma to sens? Żeby nie robić tego w ten sposób:

  1. $oArticle->addArticle($title, $content);


Tylko w ten:

  1. $article = new Article;
  2. $article -> setTitle('jakis tytul');
  3. $article -> addArticle();
nospor
Cytat
To są Twoje obiekty:
To nie są żadne obiekty a właściwości klasy/obiektu. No nie mieszaj już i tak pokręconego kodu
memory
Dziwne że można pisać we frameworku jak Kohnana, nie znając podstaw OOP
!*!
Cytat(memory @ 18.06.2013, 10:20:20 ) *
Dziwne że można pisać we frameworku jak Kohnana, nie znając podstaw OOP

Takie są skutki korzystania z FW nie znając sposobu w jaki działają.

@in5ane - możesz napisać co ta klasa miałaby w zasadzie robić? Jest do dla mnie niezrozumiale.
in5ane
Po prostu zacząłem się uczyć OOP i chciałem coś sobie małego dla nauki tworzyć. Nie miałem pomysłu na klasę żadną. Możecie podsunąć jakiś pomysł i spróbuję na nowo napisać i może bardziej to pojmę, a Wy optymistyczniej to ocenicie. Od czegoś trzeba zacząć.
b4rt3kk
No nie wiem, może napisz klasę tworzącą miniaturki z obrazków? Nie będzie to wielce problematyczne, a edukacyjne.
in5ane
Czy ta klasa jest już dobrą próbą programowania obiektowego? W dobrym kierunku idę?
  1. <?php
  2. class Thumbnail
  3. {
  4. public $name;
  5. private $img;
  6. private $width;
  7. private $height;
  8. private $img_t;
  9. private $width_t = 150;
  10. private $height_t = 150;
  11.  
  12. public function __construct($name)
  13. {
  14. $this->name = $name;
  15. $this->img = imagecreatefromjpeg($this->name);
  16. $this->width = imagesx($this->img);
  17. $this->height = imagesy($this->img);
  18. }
  19.  
  20. public function createThumb()
  21. {
  22. $this->img_t = imagecreatetruecolor($this->width_t, $this->height_t);
  23. imagecopyresampled($this->img_t, $this->img, 0, 0, 0, 0, $this->width_t, $this->height_t, $this->width, $this->height);
  24. imagejpeg($this->img_t, 'thumb_'.$this->name, 100);
  25. }
  26.  
  27. public function __destruct()
  28. {
  29. imagedestroy($this->img);
  30. imagedestroy($this->img_t);
  31. }
  32. }
  33.  
  34. $oThumb = new Thumbnail('20120229028.jpg');
  35. $oThumb->createThumb();
  36. ?>


@edit:
Oczywiście, można by dodać jeszcze możliwość dodawania rozmiaru miniatury (opcjonalna rzecz). Ale ogólnie chcę wiedzieć, czy programowanie obiektowe (takie typowe) idzie w tym kierunku, jak ja napisałem tą klasę.

@edit2:
No i zrobiłem tylko dla JPG, oczywiście normalnie powinno się zczytać rozszerzenie (np. dla JPG, GIF i PNG).
dżozef
Cytat(in5ane @ 18.06.2013, 15:53:51 ) *
Możecie podsunąć jakiś pomysł i spróbuję na nowo napisać i może bardziej to pojmę, a Wy optymistyczniej to ocenicie. Od czegoś trzeba zacząć.


człowiek/dziecko/rodzic/uczeń/student

pojazd/samochód/osobowy/dostawczy/wyścigówka/łódź/wiosłowa/motorowa
b4rt3kk
Teraz już lepiej Ci wyszło.
in5ane
A mógłbyś powiedzieć, czy to jest poprawnie napisana klasa? W dobrym kierunku idę? Oczywiście nie mówię tutaj o funkcjonalności i użyteczności.
b4rt3kk
Cytat(in5ane @ 19.06.2013, 09:35:24 ) *
A mógłbyś powiedzieć, czy to jest poprawnie napisana klasa? W dobrym kierunku idę? Oczywiście nie mówię tutaj o funkcjonalności i użyteczności.


Jak najbardziej, wszystsko jest poprawnie i idziesz w dobrym kierunku. Jednak ten fragment:

  1. $this->img = imagecreatefromjpeg($this->name);
  2. $this->width = imagesx($this->img);
  3. $this->height = imagesy($this->img);


mógłbyś umieścić w funkcji createThumb. Nie potrzebujesz aż tylu właściwości, na dobrą sprawę wystarczyłaby sama ścieżka do pliku, reszta mogłaby pozostać zmiennymi lokalnymi wewnątrz metody klasy. Ewentualnie mógłbyś dorzucić wysokość i szerokość miniaturki lub skalę pomniejszenia jako właściwości, reszta jest raczej zbędna.
!*!
  1. $oThumb = new Thumbnail('20120229028.jpg');
  2. $oThumb->createThumb();


Te "o" jest tu zbędne. Poczytaj o standardzie nazewnictwa PSR. Dorzuć też dokumentacje do tego kodu i będzie ok.
in5ane
Po prostu stwierdziłem, że główny obrazek niech będzie w konstruktorze automatycznie wykonywany, a metoda createThumb żeby zajmowała się już tworzeniem tylko i wyłącznie miniatury. Tak czy siak dziękuję za odpowiedzi i rady. Wezmę się teraz za coś większego, albo rozbuduję tą klasę (tak dla nauki). Po stworzeniu poddam ją również ocenie.
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.