Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]PHP OOP
Forum PHP.pl > Forum > Przedszkole
Codeleft
Cześć wszystkim,
zaczynam przechodzić na obiektowe pisanie skryptów. Z racji tego, że jestem typowym samoukiem nie do końca jestem pewien czy rozumiem pisanie w klasach.
Obiło mi się o uszy, że można pisać w klasach ale nie rozumieć obiektowości.

Poniżej podsyłam klasę kalendarza, która wczoraj napisałem. Można ją zaimplementować praktycznie bez grzebania w Htmlu.

  1. <?php
  2. /*
  3. #Php calendar by Codeleft
  4. #Date: 2021-03-21
  5. #Class
  6. */
  7. class calendar
  8. {
  9. private $week_day;
  10. private $month_day;
  11. private $month_days;
  12. private $month;
  13. private $true_month;
  14. private $year;
  15. private $daysArray;
  16. private $monthsArray;
  17. private $calendarArray;
  18. private $first_month_day;
  19. private $side_blocks;
  20. private $side_blocks_left;
  21. private $side_blocks_right;
  22. private $calendarBody;
  23. private $calendarHead;
  24. private $calendar;
  25. private $dayname;
  26.  
  27. function __construct()
  28. {
  29. //Numeric week day
  30. $this->week_day = date('w');
  31. //Numeric day of the month
  32. $this->month_day = date('d');
  33. //Week days names array
  34. $this->daysArray = array('Poniedziałek','Wtorek','Środa','Czwartek','Piątek','Sobota','Niedziela');
  35. //Numeric Month
  36. $this->true_month = date('m');
  37. $this->month = date('m');
  38. if ($this->month <= 9) {
  39. $this->month=+$this->month;
  40. }
  41. //Total month days num
  42. $this->month_days = date('t');
  43. //Months Array
  44. $this->monthsArray = array('Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec','Lipiec','Sierpień','Wrzesień','Październik','Listopad','Grudzień');
  45. //Year
  46. $this->year = date('Y');
  47. //Block Calculations
  48. $this->first_month_day = date("w",strtotime('now') - (($this->month_day -1) * (24 * 60 * 60)));
  49. $this->side_blocks = 35 - $this->month_days;
  50. $this->side_blocks_left = $this->first_month_day -1;
  51. $this->side_blocks_right = $this->side_blocks - $this->side_blocks_left;
  52. }
  53.  
  54. public function calendarData($key)
  55. {
  56. $this->calendarArray = array(
  57. 'week_day_num' => $this->week_day,
  58. 'week_day_nam' => $this->daysArray[$this->week_day],
  59. 'month_day_num' => $this->month_day,
  60. 'curr_month_num' => $this->month,
  61. 'curr_month_days_num' => $this->month_days,
  62. 'curr_month_nam' => $this->monthsArray[$this->month-1],
  63. 'curr_year' => $this->year
  64. );
  65.  
  66. return $this->calendarArray[$key];
  67. }
  68. public function calendarHeader($arrow)
  69. {
  70. $this->calendarHead = '<div class="calendar-header">';
  71. if ($arrow == 'on') {
  72. $this->calendarHead .= '<div class="left-arrow"><</div>';
  73. }
  74. $this->calendarHead .= '<div class="clendar-header-val" data-current-date="'.date('Y-m-d').'">';
  75. $this->calendarHead .= ' '.$this->calendarData('curr_month_nam');
  76. $this->calendarHead .= ' '.$this->calendarData('curr_year');
  77. $this->calendarHead .= '</div>';
  78. if ($arrow == 'on') {
  79. $this->calendarHead .= '<div class="right-arrow">></div>';
  80. }
  81. $this->calendarHead .= '</div>';
  82. return $this->calendarHead;
  83. }
  84.  
  85. private function calendarWeekDays()
  86. {
  87. foreach ($this->daysArray as $day) {
  88. $this->dayname .= '<div class="day-cont day-names">'.$day.'</div>';
  89. }
  90. return $this->dayname;
  91. }
  92.  
  93. public function calendarBody()
  94. {
  95. //Calendar cont
  96. $bock_num = 0;
  97. $this->calendarBody .= '<div class="calendar-body">';
  98. $this->calendarBody .= $this->calendarWeekDays().'<br />';
  99. //Left empty boxes
  100. for ($b = 1 ; $b <= $this->side_blocks_left ; $b++) {
  101. $this->calendarBody .= '<div class="day-cont outer-cont">-</div>';
  102. $bock_num++;
  103. }
  104. //Filled boxes
  105. for ($i = 1 ; $i <= $this->month_days ; $i++) {
  106. $con_date = $this->year.'-'.$this->true_month.'-'.$i;
  107.  
  108. if (( ( $bock_num%7 ) == 0 ) && ( $bock_num > 0 )) {
  109. $this->calendarBody .= '<br />';
  110. }
  111.  
  112. if ($i == $this->month_day) {
  113. $this->calendarBody .= '<div class="day-cont current-day" data-date="'.$con_date.'"><b>'.$i.'</b></div>';
  114. } else if ( (date('w',strtotime($con_date)) == 0) || (date('w',strtotime($con_date)) == 6) ) {
  115. $this->calendarBody .= '<div class="day-cont weekend-day" data-date="'.$con_date.'">'.$i.'</div>';
  116. } else {
  117. $this->calendarBody .= '<div class="day-cont" data-date="'.$con_date.'">'.$i.'</div>';
  118. }
  119.  
  120. $bock_num++;
  121. }
  122. //Right empty boxes
  123. for ($b = 1 ; $b <= $this->side_blocks_right ; $b++) {
  124. $this->calendarBody .= '<div class="day-cont outer-cont">-</div>';
  125. $bock_num++;
  126. }
  127. $this->calendarBody .= '</div>';
  128.  
  129. return $this->calendarBody;
  130. }
  131.  
  132. public function createCalendar($header,$arrow,$body)
  133. {
  134. $this->calendar .= '<div class="calendar">';
  135.  
  136. if ( $header == 'on' ){
  137. $this->calendar .= $this->calendarHeader($arrow);
  138. }
  139. if ( $body == 'on' ){
  140. $this->calendar .= $this->calendarBody();
  141. }
  142.  
  143. $this->calendar .= '</div>';
  144.  
  145. return $this->calendar;
  146. }
  147.  
  148. }

  1. /*
  2. #Php calendar by Codeleft
  3. #Date: 2021-03-21
  4. #Css
  5. */
  6. .calendar{
  7. display: inline-block;
  8. padding: 10px;
  9. background-color: white;
  10. border: 1px solid #78909c;
  11. color: #455a64;
  12. border-radius: 3px;
  13. }
  14. .calendar-header{
  15. font-family: Arial, Helvetica, sans-serif;
  16. color: #78909c;
  17. margin-bottom: 10px;
  18. border: 1px solid #e6e6e6;
  19. border-radius: 3px;
  20. background-color: white;
  21. padding: 15px;
  22. text-align: center;
  23. font-weight: bold;
  24. }
  25. .clendar-header-val{
  26. display: inline-block;
  27. }
  28. .left-arrow{
  29. float: left;
  30. cursor: pointer;
  31. }
  32. .right-arrow{
  33. float: right;
  34. cursor: pointer;
  35. }
  36. .calendar-body{
  37. display: inline-block;
  38. }
  39. .day-cont{
  40. font-family: Arial, Helvetica, sans-serif;
  41. display: inline-block;
  42. width: 100px;
  43. height: 100px;
  44. border: 1px solid #e6e6e6;
  45. color: #999999;
  46. background-color: white;
  47. padding: 3px;
  48. cursor: pointer;
  49. }
  50. .day-cont:hover{
  51. border: 1px solid #717171;
  52. color: #5a5a5a;
  53. }
  54. .current-day{
  55. background-color: #ff9800;
  56. color: white;
  57. border-radius: 10%;
  58. }
  59. .outer-cont{
  60. border: 1px solid #e6e6e6;
  61. color: white;
  62. }
  63. .outer-cont:hover{
  64. cursor: default;
  65. border: 0;
  66. color: white;
  67. }
  68. .weekend-day{
  69. color: #ef5350 !important;
  70. }
  71. .day-names{
  72. max-height: 20px!important;
  73. text-align: center;
  74. font-weight: bold;
  75. border-radius: 3px;
  76. }
  77. .day-names:hover{
  78. border: 1px solid #e6e6e6!important;
  79. color: #8a8a8a!important;
  80. cursor: default!important;
  81. }


Chciałbym aby jakaś surowa dusza wytknęła mi błędy i podpowiedziała na co zwrócić uwagę.

Dzięki za konstruktywną krytykę ! smile.gif
goku800
Na pierwszy rzut oka jest okej, ale po co przechowujesz elementy HTML w zmiennych? Nie lepiej jest mieć template HTML i w elementach wyświetlać wartości?
rad11
Moim zdaniem nie jest okej. Klasa którą utworzyłeś ma dwie odpowiedzialności, powinieneś to co najmniej podzielić. Druga sprawa to większość argumentów które tworzysz w konstruktorze powinny być przekazywane jako parametry wtedy taki obiekt jest bardziej generyczny. Zamiast używania date proponuję używanie DateTime/DateTimeInterface. Dodatkowo trzymaj się jakichś standardów klasy pisze się w formacie: NazwaTwojejKlasy już nie wspominając o nazwach pól . Metody prywatne powinny być pod public i pod protected. Dodawaj dokumentacje i typowanie do metod i pól w klasie tak aby było wiadomo co one maja zwracać.
nospor
Mozesz mi napisac co ten kod
  1. $this->month = date('m');
  2. if ($this->month <= 9) {
  3. $this->month=+$this->month;
  4. }

niby miał robic? Bo na chwile obecna nie ma on zadnego sensu.
Codeleft
goku800
Zwróć uwagę, na to, że taplatka by się chyba nie sprawdziła w dwóch różnych miesiącach dlatego "wypluwam" całą konstrukcje kalędarza.

Rad dzięki za odpowiedź!
  1. Metody prywatne powinny być pod public i pod protected

• Ustawiam private ponieważ nie chce aby właściwości czy metody były dziedziczone. Takie pierwsze kroki..

  1. Druga sprawa to większość argumentów które tworzysz w konstruktorze powinny być przekazywane jako parametry wtedy taki obiekt jest bardziej generyczny.

• Przekazywać właściwości z konstruktora jako parametry metod a nie bezpośrednio przekazywane do nich? Przepraszam, ne rozumiem pojęcie generyczności w tym kontekście - tutaj wychodzą moje braki. Dziękuje !

  1. Dodatkowo trzymaj się jakichś standardów klasy pisze się w formacie: NazwaTwojejKlasy już nie wspominając o nazwach pól

• Czy tutaj masz na myśli PSR? zdecydowanie muszę to nadrobić. Nazwy pól ? tutaj wychodzą moje braki. Dziękuje !

  1. Dodawaj dokumentacje i typowanie do metod i pól w klasie tak aby było wiadomo co one maja zwracać.

• Z tym nie będzie najmniejszego problemu.

Ropson, przeglądając forum chyba najbardziej na Ciebie liczyłem smile.gif

  1.  
  2. $this->month = date('m');
  3. if ($this->month <= 9) {
  4. $this->month=+$this->month;
  5. }


Wywalam początkowe zero z date('m') w przypadku poniżej 10 czyli zamiast 05 dostaje 5 i mogę to wrzucić do metody calendarData() jako klucz tablicy.
Jeśli można zostawić 05 to - tutaj wychodzą moje braki.

Na pewno zastosuje się do waszych uwag.

Od razu by nie zakładać kolejnego tematu nasuwa mi się kolejne pytanie.
Czy każda zmienna/właściwość musi być zdefiniowana na początku klasy i posiadać modyfikator dostępu?
Nie za bardzo mam pomysły jak wykorzystać klasy. Macie może pomysły jak mogę sobie poćwiczyć i zrozumieć zastosowanie bo pisanie klasy samochód o kolorze.... nie za bardzo mnie urządza biggrin.gif

Jeszcze raz dzięki!
gino
A co to są za parametry metody: 'no' (i chyba - 'yes')? A czemu nie a i b? Masz typ boolean, true albo false, 0 albo 1.
Osławione i klepane już na tym forum, nie:
Kod
if($a == $b)

tylko:
Kod
if($a === $b)


Szczerze nie sprawdzałem dokładnie, ale czy wszystkie atrybuty są Ci potrzebne, bo w metodzie calendarData można od razu przypisać do klucza odpowiednią wartość bez użycia atrybutu.
Kod html-a w klasie to nieporozumienie, przynajmniej dla mnie. PSR zdecydowanie do poczytania. Co można pisać? Co Ci na myśl przyjdzie.
Codeleft
Gino,
odwołując się obiektem to metody klasy w parametrach ustawiasz czy np. nagłówek kalendarza ma być wypisany ? no to 'on' jeśli nie to podaj w parametrze co tam chcesz 'off' wink.gif
Jeśli kod html w klasie to pomyłka to naprawdę nie mam pomysłu jak wykorzystać klasy.

hmm.. aktualnie w moim mini projekcie będę wypisywał taskii na podstawie statusów z bazy ale mogę to zrobić PDO i odpowiednim zapytaniem, nie widzę tutaj potrzeby klas..
gino
A kto Ci zabroni napisać własną obsługę baz danych opartą o PDO (tak dla wprawki i do innych celów) ? Jeżeli parametr ma przyjąć jedną z dwóch wartości to true lub false, to intuicyjne.
nospor
Cytat
Wywalam początkowe zero z date('m') w przypadku poniżej 10 czyli zamiast 05 dostaje 5 i mogę to wrzucić do metody calendarData() jako klucz tablicy.
Jeśli można zostawić 05 to - tutaj wychodzą moje braki.

Ach, usuwasz zero haha. Ok. No to zamiast
date('m') i potem cudowania, poprostu uzyj
date('n')
Manual sie klania wink.gif
Codeleft
wstydnis.gif Tak jak pisałem -> niedouczenie moje

Podajcie proszę jak najwięcej przykładów klas do nauki.

1) Paginacja
2) Mailer
3) ?
4) ?
5) ?
6) ?
7) ?
8) co_jest.gif

Za to dziękuje bardzo guitar.gif
viking
Najpierw zrób może ten kalendarz porządnie i pokaż efekty po przepisaniu.
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.