Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: OOP czy dobrze go stosuję ?
Forum PHP.pl > Forum > PHP > Object-oriented programming
Fanatyko
Witam, wiem że w tym dziale jest już świeży temat o stosowaniu OOP, jednak chciałbym aby ktoś zweryfikował mój kod czy to co robię jest zgodne z założeniem OOP.

Jest to przykładowy game framework, dla treningu. Mam w nim 4 klasy User, UserManager, Character, CharacterManager, oto one :

  1. <?php class User {
  2.  
  3. function __construct() {
  4.  
  5. }
  6.  
  7. private $_login = null;
  8. private $_password = null;
  9. private $_email = null;
  10. private $_id = null;
  11. private $_logged = null;
  12.  
  13. // tutaj dalej sa standardowe settery i gettery
  14.  
  15. } ?>


  1. <?php
  2. class UserManager {
  3.  
  4. function __construct($user) {
  5. $this->_user = $user;
  6.  
  7. try{
  8. $this->_pdo = new PDO('mysql:host=localhost;dbname=rsfc;', '', '');
  9. $this->_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  10. }catch(PDOException $error){
  11. echo 'Problem z baza :( :' . $error->getMessage();
  12. }
  13. }
  14.  
  15. private $_user;
  16.  
  17. public function Logon(){
  18.  
  19. $db = $this->_pdo->prepare('SELECT * FROM user_account WHERE login = :login AND password = :password');
  20. $db->execute(array(':login' => $this->_user->getLogin(), ':password' => $this->_user->getPassword()));
  21.  
  22. try{
  23.  
  24. if($user = $db->fetch()){
  25. echo "Zostales zalogowany";
  26. $this->_user->setId($user[id]);
  27. $this->_user->setLogged(1);
  28. $this->_user->setSession();
  29. }
  30.  
  31. else{
  32. throw new Exception("Nie ma Cie w bazie ! Nie zostales zalogowany :(");
  33. }
  34.  
  35. }catch(Exception $error){
  36. echo $error->getMessage();
  37. }
  38.  
  39. }
  40.  
  41.  
  42. }
  43.  
  44. ?>





  1. <?php
  2. class Character {
  3.  
  4. function __construct() {
  5.  
  6. }
  7.  
  8. private $_strenght;
  9. private $_speed;
  10. private $_dynamic;
  11. private $_condition;
  12. private $_pain;
  13. private $_endurance;
  14. private $_iq;
  15. private $_coordination;
  16. private $_technic;
  17. private $_flex;
  18. private $_life;
  19. private $_level;
  20. private $_experince;
  21. private $_needexperince;
  22. private $_money;
  23. private $_reputation;
  24. private $_movepoints;
  25.  
  26. private $_id = null;
  27.  
  28. //settery
  29.  
  30. // tutaj tez standardowe settey i gettery
  31.  
  32.  
  33. }
  34.  
  35. ?>


  1. <?php
  2. class CharacterManager {
  3.  
  4. function __construct($character) {
  5. $this->_character = $character;
  6.  
  7. try{
  8. $this->_pdo = new PDO('mysql:host=localhost;dbname=rsfc;', '', '');
  9. $this->_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  10. }catch(PDOException $error){
  11. echo 'Problem z baza :( :' . $error->getMessage();
  12. }
  13.  
  14.  
  15. }
  16.  
  17.  
  18.  
  19. private $_character;
  20. private $_pdo;
  21.  
  22. public function render(){
  23. include './views/character.php';
  24. }
  25.  
  26. public function upgradeStatistic($statistic, $how_much){
  27.  
  28.  
  29. $db = $this->_pdo->prepare('UPDATE user_character SET '.$statistic.' = '.$statistic.' + :how_much WHERE id = :id');
  30. $db->execute(array(':how_much' => $how_much, ':id' => $this->_character->getIdFromSession()));
  31.  
  32. }
  33.  
  34. public function downgradeStatistic($statistic, $how_much){
  35.  
  36.  
  37. $db = $this->_pdo->prepare('UPDATE user_character SET '.$statistic.' = '.$statistic.' - :how_much WHERE id = :id');
  38. $db->execute(array(':how_much' => $how_much, ':id' => $this->_character->getIdFromSession()));
  39.  
  40. }
  41.  
  42. public function setStatistics(){
  43. try{
  44.  
  45. $db = $this->_pdo->prepare('SELECT * FROM user_character WHERE id = :id');
  46. $db->execute(array(':id' => $this->_character->getIdFromSession()));
  47.  
  48. if($character = $db->fetch()){
  49. $this->_character->setCondition($character['condition']);
  50. $this->_character->setCoordination($character['coordination']);
  51. $this->_character->setDynamic($character['dynamic']);
  52. $this->_character->setEndurance($character['endurance']);
  53. $this->_character->setExperince($character['experince']);
  54. $this->_character->setFlex($character['flex']);
  55. $this->_character->setIq($character['iq']);
  56. $this->_character->setLevel($character['level']);
  57. $this->_character->setLife($character['life']);
  58. $this->_character->setMoney($character['money']);
  59. $this->_character->setMovePoints($character['move_points']);
  60. $this->_character->setNeedExperince($character['needexperince']);
  61. $this->_character->setPain($character['pain']);
  62. $this->_character->setReputation($character['reputation']);
  63. $this->_character->setSpeed($character['speed']);
  64. $this->_character->setStrenght($character['strenght']);
  65. $this->_character->setTechnic($character['technic']);
  66.  
  67. }else{
  68. throw new Exception('Nie moge uaktualnic statystyk :(');
  69. }
  70. }
  71. catch(Exception $error){
  72. echo 'Wystapil blad:' . $error->getMessage();
  73. }
  74. }
  75.  
  76. }
  77. ?>


Index.php

  1. <?php
  2.  
  3. require 'class/Character.php';
  4. require 'class/CharacterManager.php';
  5. require 'class/User.php';
  6. require 'class/UserManager.php';
  7.  
  8. $User = new User;
  9. $User->setLogin('');
  10. $User->setPassword(md5(''));
  11.  
  12. $UserManager = new UserManager($User);
  13. $UserManager->Logon();
  14.  
  15. try{
  16. if($User->getLogged() == 1){
  17.  
  18. $Character = new Character;
  19. $Character->setIdFromSession();
  20. $CharacterManager = new CharacterManager($Character);
  21. $CharacterManager->upgradeStatistic('strenght', 5);
  22. $CharacterManager->setStatistics();
  23. echo $Character->getStrenght();
  24. }else{
  25. throw new Exception('Nie jestes zalogowany !');
  26. }
  27.  
  28.  
  29. }catch(Exception $error){
  30. echo 'Wystapil blad:'.$error->getMessage();
  31.  
  32. }
  33.  
  34.  
  35.  
  36. ?>



Pytania:

1. Głowne - czy ten kod jest zgodny z OOP ?
2. Czy metoda Logon() powinna być w klasie UserManager czy w osobnej np. Login
3. Czy tworzenie obiektu User a potem przekazywanie go do UserManager w celu obróbki itp jest prawidłowe ? Czy w klasie UserManager powinna być metoda tworząca obiekt User ? (to tyczy się również klas Character i CharacterManager)

Proszę o wytknięcie mi błedów i sposobów w jaki mogę je poprawić wink.gif

smentek
Cytat
1. Głowne - czy ten kod jest zgodny z OOP ?


To czy jakiś obiekt ma sens, czyli czy powinien istnieć czy nie, nie wynika bezpośrednio z tego że program jest OOP tylko z dziedziny problemu który program rozwiązuje. Ale jeżeli hurtowo nazywasz swoje obiekty "manager" to coś może być nie tak. Zbyt ogólna nazwa sugeruje że obiekt robi zbyt wiele rzeczy lub że sam nie wiesz co ma robić.

Cytat
Czy metoda Logon() powinna być w klasie UserManager czy w osobnej np. Login


Moja propozycja: Olej całkowicie logowanie. Skup się na problemie który twój program ma rozwiązywać.

Cytat
tworzenie obiektu User a potem przekazywanie go do UserManager w celu obróbki itp jest prawidłowe ? Czy w klasie UserManager powinna być metoda tworząca obiekt User ? (to tyczy się również klas Character i CharacterManager)


Staramy się wstrzykiwać obiekty w inne obiekty a nie inicjalizować jedne w drugich. Oczywiście inicjalizacja musi gdzieś nastąpić. Także to że przekazujesz usera do innego obiektu jest ok, pytanie tyko czy wiesz do czego ma słuzyc manager?
Fanatyko
No właśnie też złapałem się na tym, że rzucam nazwą manager jak popadnie, ale teraz wszędzie widzę do tego zastosowanie, nie wiem czemu :/ Mogę prosić o jakiś pomysł jak inaczej nazwać, rozbić te klasy ?

A co do tego czy wiem czemu ma służyć manager to chyba do tego aby zarządzać - dodawać, edytować, wybierać użytkowników itp. (w przypadku klasy UserManager).

Cytat
Olej całkowicie logowanie. Skup się na problemie który twój program ma rozwiązywać.


Prawdę mówiąc nie wiem czy złapałem o co chodzi wink.gif
rahul
mysle ze mozesz sobie poczytac moj post, zadawalem niemal ze identyczne pytania a dyskusja sie rozwinela calkiem na bogato.
Temat: prawidlowe OOP struktura klasy
elektrrrus
Prawdopodobnie całkiem przez przypadek, ale zrobiłeś sobie małe Entity manager w stylu Doctrine 2. Zobacz jak tam jest rozwiązane zarządzanie obiektami które swoje właściwości zaciągają z bazy danych.
Spawnm
Za łączenie z pdo powinna odpowiadać klasa db a nie userManager czy characterManager. Czemu 2 razy dajesz połączenie? Użyj dependency injection.
Echo i exception w modelu? Wywal echo.
I tak jak pisze Rahul, zapoznaj się z podobnymi tematami.
smentek
Cytat
Prawdę mówiąc nie wiem czy złapałem o co chodzi wink.gif


Chodzi mi o to ze program mozna koncepcyjnie podzielić na:

- Cześć APLIKACYJNA, która jest "wspólna" dla większości systemów www. Do tego wchodzi np. autoryzacja. (twoje logowanie) obsługa sesji, jakaś implementacja MVC (lub prostszy mechanizm zamiast MVC). Routingu.

Tej części nie wymyślaj od nowa użyj jakiegoś frameworku.

- Część BIZNESOWĄ która jest unikalna dla danego systemu. Jeżeli piszesz system do obsługi pizzerii to to będą obiekty Kucharz, Klient, Pizza, Składnik, Pizzy, Kelner, etc. (z palca pisze).

Skup się na tej części biznesowej a pierwszą znajdziesz w gotowych rozwiązaniach. Obie warstwy powinny zajmować się różnymi rzeczami. To znaczy obiekt Kucharz nie powinien implementować logowania ani zapisu danych dobazy, nawet jeżeli koncepcyjnie użytkownik będący kucharzem może się logować.

Obiekt Kucharz może za to przyjmować w konstruktorze obiekty Składaniki Pizzy oraz posiadać metodę makePizza() która zwraca Pizze.

Poćwicz sobie tworzenie systemów składających się z małych obiektów które rozwiązują tego typu problemy.

Bez tej umiejętności będziesz jak papuga która klepie bezmyślnie kod według koncepcji wymyślonych przez innych, których to koncepcji nawet nie rozumie, ale sam nie będziesz potrafił zaprojektować nawet prostego systemu...
Fanatyko
Cytat
mysle ze mozesz sobie poczytac moj post, zadawalem niemal ze identyczne pytania a dyskusja sie rozwinela calkiem na bogato.
Temat: prawidlowe OOP struktura klasy


Właśnie ten temat miałem na myśli pisząc, że jest tutaj świeży temat o OOP. Przestudiowałem twój temat parę razy, właśnie na jego podstawie napisałem to tutaj, jednak chciałbym aby ktoś spojrzał na mój kod.

Cytat
Prawdopodobnie całkiem przez przypadek, ale zrobiłeś sobie małe Entity manager w stylu Doctrine 2. Zobacz jak tam jest rozwiązane zarządzanie obiektami które swoje właściwości zaciągają z bazy danych.


Poczytam o tym wink.gif

Cytat
Za łączenie z pdo powinna odpowiadać klasa db a nie userManager czy characterManager. Czemu 2 razy dajesz połączenie? Użyj dependency injection.
Echo i exception w modelu? Wywal echo.
I tak jak pisze Rahul, zapoznaj się z podobnymi tematami.


Ok, poprawię to. Zresztą miałem tak robić ale nie wiem czemu z tego zrezygnowałem wink.gif

Cytat
Poćwicz sobie tworzenie systemów składających się z małych obiektów które rozwiązują tego typu problemy.

Bez tej umiejętności będziesz jak papuga która klepie bezmyślnie kod według koncepcji wymyślonych przez innych, których to koncepcji nawet nie rozumie, ale sam nie będziesz potrafił zaprojektować nawet prostego systemu...


Własnie wiem, że aktualnie jestem taką papugą wink.gif Twój post zresztą dosyć sporo pomógł mi w zrozumieniu jakie klasy przygotowywać aby miało to ręce i nogi, postaram się zastosować do tego. Dzięki.

Ogólnie wasze posty bardzo mi pomogły, dziękuję za zainteresowanie moim tematem mimo tego, że było już takich 2131545 wink.gif Mam kolejne pytania:
Zakładając, że chcę napisać klasę do logowania/rejestracji, jak powinienem to rozdzielić ? Osobna klasa do rejestracji i logowania, czy np. ogólnie klasa która będzie odpowiadała za te czynności ? Bo w zasadzie taką klasą miała być klasa UserManager, w niej miały znajdować się rejestracja, logowanie, wylogowywanie, usuwanie userów itp. Czy jest to prawidłowe założenie ?


@smentek
Ta klasa byłaby w części aplikacyjnej tak ? A Character i CharacterManager to już część biznesowa tak?

melkorm
jeżeli masz dane w tablicy o takich samych nazwach jak pola to możesz zrobić sobie metodę setFromArray zamiast tego:
Kod
  $this->_character->setCondition($character['condition']);
                $this->_character->setCoordination($character['coordination']);
                $this->_character->setDynamic($character['dynamic']);
                $this->_character->setEndurance($character['endurance']);
                $this->_character->setExperince($character['experince']);
                $this->_character->setFlex($character['flex']);
                $this->_character->setIq($character['iq']);
                $this->_character->setLevel($character['level']);
                $this->_character->setLife($character['life']);
                $this->_character->setMoney($character['money']);
                $this->_character->setMovePoints($character['move_points']);
                $this->_character->setNeedExperince($character['needexperince']);
                $this->_character->setPain($character['pain']);
                $this->_character->setReputation($character['reputation']);
                $this->_character->setSpeed($character['speed']);
                $this->_character->setStrenght($character['strenght']);
                $this->_character->setTechnic($character['technic']);
smentek
Cytat
Zakładając, że chcę napisać klasę do logowania/rejestracji, jak powinienem to rozdzielić ? Osobna klasa do rejestracji i logowania, czy np. ogólnie klasa która będzie odpowiadała za te czynności ?


Im mniejsze czyli bardziej rozdrobnione obiekty tym lepszy system. Z drugiej strony jeżeli ma to być prosty system to nie ma sensu sztucznie go komplikować, tak że możesz rejestracje i logowanie zrobić w jednym obiekcie, tylko niech to nie będzie ten sam obiekt który reprezentuje użytkownika. Może 'UserAuthorisation'?

Cytat
Bo w zasadzie taką klasą miała być klasa UserManager, w niej miały znajdować się rejestracja, logowanie, wylogowywanie, usuwanie userów itp. Czy jest to prawidłowe założenie ?


Tak ale nazwa tego obiektu nie mówi o tym co obiekt robi.

Cytat
@smentek
Ta klasa byłaby w części aplikacyjnej tak ? A Character i CharacterManager to już część biznesowa tak?


Charakter jest biznesowy. A CharacterManager to obiekt, który powinien zostać podzielony na tyle obiektów ile widzisz 'problemów' do rozwiązania z wiązanych z obiektem Character. Każdy nowy kontekst wprowadza nowe obiekty.

Jeżeli chodzi o sam obiekt Character. Nawrzucałeś do niego różnych zmiennych które ci przyszły do głowy a które nie mają jakiegokolwiek uzasadnienia. Obiekt Character to nie jest prawdziwy obiekt w rozumieniu OOP. Od tablicy różni go tylko forma zapisu.

Przykładowo $_speed. Czym jest speed? Prędkość z którą porusza się byt w danym momencie czy maksymalna prędkość z którą może się poruszać? Prędkość to jest coś względnego. Względem czego liczysz prędkość? Jeżeli nie masz tego czegoś to może i sama speed powinna na razie zniknąć? Może prędkość nie powinna być zmienną tylko wynikać z relacji obiektów, tak jak w świecie rzeczywistym?

Fanatyko
Cytat
Im mniejsze czyli bardziej rozdrobnione obiekty tym lepszy system. Z drugiej strony jeżeli ma to być prosty system to nie ma sensu sztucznie go komplikować, tak że możesz rejestracje i logowanie zrobić w jednym obiekcie, tylko niech to nie będzie ten sam obiekt który reprezentuje użytkownika. Może 'UserAuthorisation'?


Brakowało mi zamiennika nazwy tongue.gif Dzięki, po raz kolejny.

Cytat
Jeżeli chodzi o sam obiekt Character. Nawrzucałeś do niego różnych zmiennych które ci przyszły do głowy a które nie mają jakiegokolwiek uzasadnienia. Obiekt Character to nie jest prawdziwy obiekt w rozumieniu OOP. Od tablicy różni go tylko forma zapisu.


W którymś tematcie o OOP było napisane, że całkiem rozsądne jest robienie takich kontenerów-obiektów zawierających dane. Są tam zmienne, settery i gettery. Czy jednak to jest zło i należy to zmienić ?

Cytat
Przykładowo $_speed. Czym jest speed? Prędkość z którą porusza się byt w danym momencie czy maksymalna prędkość z którą może się poruszać? Prędkość to jest coś względnego. Względem czego liczysz prędkość? Jeżeli nie masz tego czegoś to może i sama speed powinna na razie zniknąć? Może prędkość nie powinna być zmienną tylko wynikać z relacji obiektów, tak jak w świecie rzeczywistym?


Prawdę mówiąc w kontekście tego co chcę zrobić, nie potrzebuję takich "szerszych horyzontów" bo $_speed ma po prostu być zwykłą statystyką, na której podstawie będzie można wyliczyć np. szanse na unik/trafienie.



To znowu ja biggrin.gif

Zmiany:

Dodałem klasę UserAuthorisation dzięki której po przekezaniu obiektu User można się zalogować.
  1. <?php
  2. class UserAuthoristation {
  3.  
  4. function __construct($user) {
  5. $this->_user = $user;
  6.  
  7. $this->_db = new Database();
  8. $this->_db->connect();
  9. }
  10.  
  11. private $user;
  12.  
  13. public function Logon(){
  14.  
  15. $q = $this->_db->_pdo->prepare('SELECT * FROM user_account WHERE login = :login AND password = :password');
  16. $q->execute(array(':login' => $this->_user->getLogin(), ':password' => $this->_user->getPassword()));
  17.  
  18. try{
  19.  
  20. if($user = $q->fetch()){
  21. echo "Zostales zalogowany";
  22. $this->_user->setId($user[id]);
  23. $this->_user->setLogged(1);
  24. $this->_user->setSession();
  25. }
  26.  
  27. else{
  28. throw new Exception("Nie ma Cie w bazie ! Nie zostales zalogowany :(");
  29. }
  30.  
  31. }catch(Exception $error){
  32. echo $error->getMessage();
  33. }
  34.  
  35. }
  36.  
  37. }
  38. ?>
  39.  


Dodałem klase Database do obsługi bazy danych, za wiele w niej nie ma smile.gif

  1.  
  2. class Database {
  3.  
  4. function __construct() {
  5.  
  6. }
  7.  
  8. public function connect(){
  9. try{
  10. $this->_pdo = new PDO('mysql:host=localhost;dbname=;', '', '');
  11. $this->_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  12. }catch(PDOException $error){
  13. echo 'Problem z baza :( :' . $error->getMessage();
  14. }
  15. }
  16.  
  17. }
  18.  
  19.  


Zmiany w klasie UserManager, dodałem funkcję tworzącą użytkownika, wywalilem z niej funkcje logującą i dodałem wykorzystanie klasy Database.
  1. class UserManager {
  2.  
  3. function __construct($user) {
  4. $this->_user = $user;
  5. $this->_db = new Database;
  6. $this->_db->connect();
  7. }
  8.  
  9. private $_user;
  10.  
  11. public function create(){
  12. $q = $this->_db->_pdo->prepare('INSERT INTO user_account VALUES(null,:login,:nick,:password,:email)');
  13. $q->execute(array(':login' => $this->_user->getLogin(), ':password' => $this->_user->getPassword(), ':nick' => 'test', 'email' => 'test'));
  14.  
  15. return "User zostal stworzony";
  16. }
  17.  
  18.  
  19. }
  20.  


W index.php dorzuciłem tworzenie usera.

  1.  
  2. <?php
  3.  
  4. require 'class/Character.php';
  5. require 'class/CharacterManager.php';
  6. require 'class/User.php';
  7. require 'class/UserManager.php';
  8. require 'class/Database.php';
  9. require 'class/UserAuthorisation.php';
  10.  
  11. //logowanie
  12.  
  13. $User = new User;
  14. $User->setLogin('Fanatyko');
  15. $User->setPassword(md5('beniamins9'));
  16.  
  17. $UserAuthorisation = new UserAuthoristation($User);
  18. $UserAuthorisation->Logon();
  19.  
  20. // zwiekszanie statystyk jesli jest sie zalogowanym
  21. try{
  22. if($User->getLogged() == 1){
  23.  
  24. $Character = new Character;
  25. $Character->setIdFromSession();
  26. $CharacterManager = new CharacterManager($Character);
  27. $CharacterManager->upgradeStatistic('strenght', 5);
  28. $CharacterManager->setStatistics();
  29. echo $Character->getStrenght();
  30. }else{
  31. throw new Exception('Nie jestes zalogowany !');
  32. }
  33.  
  34.  
  35. }catch(Exception $error){
  36. echo 'Wystapil blad:'.$error->getMessage();
  37.  
  38. }
  39.  
  40. //tworzenie nowego usera
  41.  
  42. $User2 = new User;
  43. $User2->setLogin('Test');
  44. $User2->setPassword(md5('test'));
  45.  
  46. $UserManager2 = new UserManager($User2);
  47. $UserManager2->create();
  48.  
  49.  
  50. ?>


Jest dobrze ?
Fantazyn
Dla mnie kod wygląda całkiem znośnie, ale:
1. Unikaj takiego kodu
  1. }catch(Exception $error){
  2. echo 'Wystapil blad:'.$error->getMessage();
  3.  
  4. }

Pokażesz wtedy jaki błąd wystąpił wszystkim użytkownikom (jak się łączysz, tabelę do której się łączysz), nie dość, że jest to nieeleganckie to i w przyszłości kiedyś ktoś może tą wiedzę wykorzystać przeciw Tobie (sql injection).
Możesz sam napisać jakaś klasę do obsługi własnych błędów, a błędy systemowe zapisywać do jakich logów.

2.
  1. if($User->getLogged() == 1){

Czepiam się, ale bardziej naturalne wydaje mi się, że funkcja getLogged powinna powinna być funkcją typu isLogged i zwracać wartość boolean.

3.UserManager.php
  1. public function create(){
  2. $q = $this->_db->_pdo->prepare('INSERT INTO user_account VALUES(null,:login,:nick,:password,:email)');
  3. $q->execute(array(':login' => $this->_user->getLogin(), ':password' => $this->_user->getPassword(), ':nick' => 'test', 'email' => 'test'));
  4.  
  5. return "User zostal stworzony";
  6. }

Nie podoba mi się zwracanie stringa, że funkcję create(). Czy zadaniem funkcji jest zwracaniem napisu? Raczej nie, według mnie nic nie powinna zwracać (najwyżej rzucać wyjątkiem podczas niepowodzenia) lub symbolicznie wartość logiczną w zależności od powodzenia.
Jeśli bardzo chcesz już stosować jakieś stałe napisowe, to nie w ten sposób. Utwórz na przykład sobie statyczne pola z napisami, które będą symbolizowały statusy zakończony akcji i porównywuj tylko statusy, wtedy jeśli w przyszłości będziesz chciał zmienić napis to zrobisz to w jednym miejscu.

Pozdrawiam
banditpanda

class Database {

function __construct() {
$this->_pdo = new PDO('mysql:host=localhost;dbname=rsfc;', 'root', 'beniamins9');
$this->_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}


}

wydaje mi się, że nie używa się polecenia echo w modelu bazy
Fanatyko
@Fantazyn

dzięki za odpowiedź, naprawdę mi się przydała. Jakoś nie pomyślałem o logach, nie wiem czemu wink.gif. W niedługim czasie poprawię po raz kolejny mój kod wink.gif

@banditpanda

poprawię to wink.gif
smentek
Cytat
"W którymś tematcie o OOP było napisane, że całkiem rozsądne jest robienie takich kontenerów-obiektów zawierających dane. Są tam zmienne, settery i gettery. Czy jednak to jest zło i należy to zmienić ?"


Ale taki obiekt który ma tylko dane + gettery i settery jest jak lodówka która nie mrozi albo auto które nie jeździ. Niewiele różni się od tablicy albo zbioru luźnych zmiennych.

Zależy czym ma być ten obiekt.Tu są dwie strony medalu:

1. Getery i setery są konwencją która pozwala na pewnego rodzaju "rozpoznawalny" interfejs dostępu do danych obiektu. Dzięki czemu łatwiej zaprzęgnąć do pracy zewnętrzną bibliotekę tak aby współdziałała z twoimi obiektami. Np chcesz wprowadzić zapis obiektów do bazy danych. Zamiast pisać własny kod który to obsługuje korzystasz z Doctrine2. Albo chcesz przeprowadzać inicjalizację przez kontener IoC. Jakikolwiek nie był by to mechanizm musi jakoś obsługiwać twoje obiekty, zrobi to dzięki getterom i setterom które umieścisz w swoim obiekcie. (To nie musi być zewnętrzny system to moze byc system który sam chcesz napisac) I to jest dobre prawidłowe wykorzystanie get i set.

2. Getery i setery mogą też stać się 'protezami' dla programisty który nie potrafi zaplanować dobrze kodu i zamiast prosić obiekt aby ten coś dla niego wykonał co chwile używa get i set aby cos z obiektu wyciągnąć albo cos do niego wrzucic.

Czyli zamiast


  1. $kucharz = new Kucharz(array($skladnik, $skladnik))
  2. $pizza = $kucharz->robPizze('Roma')


piszesz

  1.  
  2. $pizza = new Pizza();
  3. $pizza->setSkladnik1($skladnik);
  4. $pizza->setSkladnik2($skladnik);
  5. $kucharz = new Kucharz()
  6. $kucharz->setPizzaName('Roma')
  7. $kucharz->setPizza($pizza);
  8. $pizza = $kucharz->getPizza($pizza);


I to jest złe stosowanie get i set. Jezeli wprowadzasz get i set do swojego systemu nie wiedząc DOKLADNIE do czego jest ci to potrzebne to już zrobiłeś błąd.
Fanatyko
Cytat
I to jest złe stosowanie get i set. Jezeli wprowadzasz get i set do swojego systemu nie wiedząc DOKLADNIE do czego jest ci to potrzebne to już zrobiłeś błąd.


Czyli tak, zrobiłem błąd, wrzuciłem settery i gettery bo wszędzie o tym trąbią i że powinno się je mieć.

A więc np. jeśli mam taki kod :

  1. $User = new User;
  2. $User->setLogin('');
  3. $User->setPassword(md5(''));


to powinienem to zrobić tak:

  1. $User = new User('haslo', 'login')


i wtedy konstruktorze wykorzystać settery czy normalnie przypisać do zmiennych ?


Cytat
Ale taki obiekt który ma tylko dane + gettery i settery jest jak lodówka która nie mrozi albo auto które nie jeździ. Niewiele różni się od tablicy albo zbioru luźnych zmiennych.


Bez tego obiektu nie mam czego wstrzyknać do klas UserManager, UserAuthorisation. Coś muszę im przekazywać, przynajmniej tak mi się zdaję.
daren88
Główny problem tej klasy na co już niektórzy zwrócili uwagę to tworzenie nowego połączenia za każdym razem gdy tworzony jest nowy obiekt .
CuteOne
Mi nie podoba się jedna rzecz... zrobiłeś z klasy User kontener dla danych. Po co klasie User wiedzieć jaki login a tym bardziej hasło jest przekazywane przez formularz? Od tego masz klasę UserAuthorisation, która to może (ale nie musi) wypełnić danymi klasę User wysyłając do niej unikalne id użytkownika. Dobry przykład autoryzacji znajdziesz w książce PHP5 Zaawansowane programowanie
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.