Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] OOP - poprawnie?
Forum PHP.pl > Forum > PHP
emajl22
piszę sobie coś obiektowo i mój index wygląda mniej więcej tak:
  1. // gora
  2. <?php
  3. require_once('./silnik.php');
  4. $api = new API;
  5.  
  6. $api->doContent($cos);
  7. ?>
  8. //dol

i teraz pytanie - dobrze to jest napisane? chodzi mi o samą logikę aplikacji...

klasa silnik.php wygląda tak:
  1. class API {
  2.  
  3. public function __construct() {
  4. // laczenie z baza
  5. // doklejanie innych klas i ich inicjowanie
  6. }
  7.  
  8. public function doContent($param) {
  9. switch($this->protect($param))) {
  10. case 'rejestracja':
  11. include('./class/rejestracja.class.php');
  12. break;
  13. case 'kontakt':
  14. include('./views/kontakt.php');
  15. break;
  16. default:
  17. if (isset($_SESSION['cos']))
  18. // zalogowany
  19. else
  20. include('./views/default.php');
  21. break;
  22. }
  23. }
  24.  
  25. public function protect($co) {
  26.  
  27. // zabezpieczanie danych z formularzy, getow itd
  28. return $co;
  29.  
  30. }
  31. }

w dobrym ide kierunku?
matix
W złym. Od tego jest framework - czyli Symfony czy też Zend (wiem, wiem są jeszcze inne równie dobrze, ale nie o to tutaj chodzi).
Po co chcesz wynajdować koło od nowa?

Stanowczo w złym kierunku idziesz. Zajmij się logiką aplikacji, a nie tym, co ma ją obsługiwać - to zostaw profesjonalistom, którzy pracują nad tym latami i wiedzą w jaki sposób ma to wszystko działać.
Crozin
W złym.

1. Nie trzymasz się konwencji nazewnictwa. Co to za dziwny pomysł by w pliku silnik.php (już mieszanie polskiego i angielskiego pomińmy) znajdowała się klasa API? - jej nazwa swoją drogą też powala.
2. http://en.wikipedia.org/wiki/Single_responsibility_principle
3. Korzystaj z mechanizmów automatycznego ładowania.
emajl22
to tylko przykład był :/

Crozin, możesz jaśniej o pkt 3?
KKH
Jak dla mnie trochę popsuta hermetyzacja.

Metody doContent() i protect() klasy API odpowiadają dość różnym zadaniom. Nie powinno się projektować klasy, która robi zbyt wiele rzeczy na raz. Generalnie 1 rzecz = 1 klasa. Zbyt obszerna klasa przestaje mieć coś wspólnego z obiektówką, a staje się bardziej "modułem", tzn. czymś w rodzaju "przestrzeni nazw" dla strukturalnego zbioru funkcji. Czemu to złe? Chcesz np. coś zmienić w protect(). Być może protect() działa w prozumieniu z jakimś polem prywatnym, powiedzmy $prot. Ale czy $prot nie jest używana gdzieś w doContent()? Tego już nie jesteś pewien. Aby zmodyfikować jedną funkcjonalność muisz analizować kod, który nie ma z nią związku. Nie temu służy idea programzowania obiektowego.

Te Twoje API robi za kontroler, walidator (unieszkodlwiajacy niebezpieczne stringi - ale na co: HTML, SQL?) i za model, np. zarządza użytkownikami tak:

  1. if (isset($_SESSION['cos']))
  2. // zalogowany


A przecież gdy myślimy obiektowo, to aż się prosi by użytkownikowi odpowiadała osobna klasa.


Cytat(matix @ 12.02.2011, 20:25:28 ) *
W złym. Od tego jest framework - czyli Symfony czy też Zend (wiem, wiem są jeszcze inne równie dobrze, ale nie o to tutaj chodzi).
Po co chcesz wynajdować koło od nowa?


Kolega pisał: "dobrze to jest napisane? chodzi mi o samą logikę aplikacji...". Przecież coś nie może być napisane źle i nielogicznie tylko dlatego, że nie używa framewroka. Co innego, gdy rozważymy cel tego pisania. Mały, duży system. Nauka, praca, hobby? Dojdzie ktoś do zespołu itd.
emajl22
KKH, wreszcie coś do mnie trafiło jeśli chodzi o oop, za co wielkie dzięki.

Tylko teraz pytanie; przyczepiłeś się do:
  1. if (isset($_SESSION['cos']))
  2. // zalogowany

nie rozumiem jak można to inaczej zapisać... jedynie co mi przychodzi na myśl to:
  1. $user->showContent()

i w tym pliku dać sprawdzanie sesji i ew. opcje (jeśli zalogowany)

teraz z innej półki - czepiacie się html'a w kodzie i jak najbardziej wiem, że to racja, ale jak inaczej to zapisać? stworzyć plik np. error.php i:
  1. $error['db_connect'] = '<div..>Brak połączenia z bazą danych.</div>';
  2. $error['db_select'] = '<div..>Nie mogę wybrać bazy danych....</div>';

tak? i jeszcze jedno - jak zaimplementować nową klasę w klasie tylko raz?
  1. $klasa = new KLASA;

w którym miejscu to dodać? jak dam nad klasą to jej nie wykrywa, jak dam w konstruktorze także... oczywiście includuje ją wcześniej. Teraz muszę w każdej metodzie dodawać to $klasa = new KLASA; a przecież to jest bezsens..

#edit;
__autoload mi pomoże biggrin.gif biggrin.gif (sory wookieb)
Mephistofeles
Lepiej zajmij się nauką jakiegoś frameworka, np. Symfony 2. Bez doświadczenia nie napiszesz dobrego systemu, a to co robisz to zwyczajna strata czasu.
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.