Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]OOP - kilka pytań o sens i poprawność "mojego" kodu
sadistic_son
post
Post #1





Grupa: Zarejestrowani
Postów: 1 495
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Cześć,
Przerobiłem na własne potrzeby kod z ksiązki ale nie do końca rozumiem, czy robię to logicznie. Generalnie to kod działa, ale sądzę, że mam tam zbędne kawałki. dodatkowo pytanie - czy to w ogóle tak powinno wyglądać?

klasa PageDisplay:
  1. namespace nameOne;
  2.  
  3. class PageDisplay
  4. {
  5. private $request;
  6. private $post;
  7. private $get;
  8.  
  9. public function __construct($request)
  10. {
  11. $requestString = \explode("?", $request);
  12. $this->request = empty($requestString) ? $request : $requestString[0];
  13. }
  14. public function processRequest()
  15. {
  16.  
  17. if (!$this->request) {
  18. return;
  19. }
  20.  
  21. $this->post = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
  22. $this->get = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING);
  23.  
  24. switch ($this->request) {
  25. case "/":
  26. $title = 'Product List';
  27. $pageContent = "ProductList";
  28. include("ProductList.php");
  29. break;
  30. case SUBDOMAIN."add-product":
  31. $title = 'Product Add';
  32. $pageContent = "ProductAdd";
  33. include("ProductAdd.php");
  34. break;
  35. case "/mass_delete":
  36. //metoda massDelete
  37. break;
  38. case "/save":
  39. //metoda save new product
  40. break;
  41. default:
  42. $title = 'Product List';
  43. $pageContent = "ProductList";
  44. include("ProductList.php");
  45. break;
  46.  
  47. }
  48. $this->displayHeader($title);
  49. require('views/' . $pageContent . '.view.php');
  50. $this->displayFooter();
  51. }
  52.  
  53.  
  54. private function displayHeader($title)
  55. {
  56. require_once("views/html/header.html");
  57. }
  58.  
  59.  
  60. private function displayFooter()
  61. {
  62. require_once("views/html/footer.html");
  63.  
  64. }
  65.  
  66. }


Teraz w index.php mam wywołanie tej klasy i metod:
  1. include("PageDisplay.php");
  2. $page = new PageDisplay($_SERVER['REQUEST_URI']);
  3. $page->processRequest();


Moje pytania.

1. Uważam, że obiekt klasy PageDisplay jest zbędny. Skoro odwołuję się tylko do jej metod to przerobiłbym processRequest() , displayHeader($title) oraz displayFooter() na metody statyczne i w index.php odwoływałbym się do PageDisplay::processRequest Ma to sens?

2. Czy w $page = new PageDisplay($_SERVER['REQUEST_URI']); powinienem jako paramert podać właśnie REQUEST_URI? Właściwie tylko to działa....

3. Jak mam się odwoływać do $_POST czy $_GET w reszcie kodu ? No bo już nie tradycyjnie if(isset($POST['add'])){ //add(); } skoro mamy taki zapis $this->post = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

Trochę się w tym pogubiłem i potrzebuję naprowadzenia. Dzięki z góry.

Ten post edytował sadistic_son 5.01.2023, 10:21:38
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




- Brakuje typowania
- jak zwykle nazwy zmiennych z 4 liter
przyklady: $request i $this->request
przeciez te zmiennej nazywaja sie tak samo a zawieraja zupelnie co innego

albo to:
$requestString = \explode("?", $request);
przeciez explode zwraca tablice a ty zmienna nazwales string, jakby zawierala tekst.

- case SUBDOMAIN."add-product":
klasa nie powinna miec wiedzy o jakies tam stalej SUBDOMAIN

- do GET/POST powinnienies miec oddzielna klase

- i nie, unikaj metod statycznych

- $this->request = empty($requestString) ? $request : $requestString[0];
explode zawsze zwraca tablice z przynjamniej jednym elementem wiec nigdy nie bedzie puste wiec twoj kod moze wygladac tak:
$this->request = $requestString[0];
pomijajac rzecz jasna nazewnictwo o ktorym juzpisalem

- no i badz konsekwentny, jak juz uzywasz glownego namespace dla explode, to uzywaj i dla empty czy tam innych metod z glownego namespace
Go to the top of the page
+Quote Post
sadistic_son
post
Post #3





Grupa: Zarejestrowani
Postów: 1 495
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Cytat(nospor @ 5.01.2023, 10:29:53 ) *
- Brakuje typowania
Ma być wszędzie? Do każdej zmiennej i metody? To chyba stosunkowo nowe podejście, bo jak zaczynałem przygodę z php w 2006 to wtedy było mówione, że w php tego robić nie trzeba. A przynajmniej tak pamiętam..

Cytat(nospor @ 5.01.2023, 10:29:53 ) *
- jak zwykle nazwy zmiennych z 4 liter
Tylko $page, $get i $post mają mniej niż 5 liter (no i $this). To mam te 3 zmienne nazwać inaczej? Nie mówią same za siebie czym są?

Cytat(nospor @ 5.01.2023, 10:29:53 ) *
przyklady: $request i $this->request
przeciez te zmiennej nazywaja sie tak samo a zawieraja zupelnie co innego
Nie rozumiem. Jak tworzę private $request; i używam go w metodzie jako parametru, to odwołując się do $this->request odwołuję się do innej zmiennej?


Cytat(nospor @ 5.01.2023, 10:29:53 ) *
- $this->request = empty($requestString) ? $request : $requestString[0];
explode zawsze zwraca tablice z przynjamniej jednym elementem wiec nigdy nie bedzie puste wiec twoj kod moze wygladac tak:
$this->request = $requestString[0];
Ok, racja. Przepisałem to żywcem z książki, to widzę, że autor popełnił bubel.


Cytat(nospor @ 5.01.2023, 10:29:53 ) *
- case SUBDOMAIN."add-product":
klasa nie powinna miec wiedzy o jakies tam stalej SUBDOMAIN
Całą tą stonę mam w folderze, powiedzmy 'stronka'. Więc jej adres to localhost/stronka a po przeniesieniu na hosting będzie mójhosting.pl/stronka. Więc skoro korzystam z $_SERVER['REQUEST_URI'] to po wybraniu /add-product $_SERVER[REQUEST_URI'] zawiera /stronka/add-product. Jak inaczej w takim razie miałby wyglądać ten case skoro nie powinienem tam dodać SUBDOMAIN, które ma wartość '/stronka/' ?

Cytat(nospor @ 5.01.2023, 10:29:53 ) *
- do GET/POST powinnienies miec oddzielna klase
Dobra, się zrobi.

Cytat(nospor @ 5.01.2023, 10:29:53 ) *
- i nie, unikaj metod statycznych
Dlaczego? To zła praktyka? Mam zawsze tworzyć obiekt?


A moje pytania 2 i 3 ?


Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 16.10.2025 - 01:22