Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Czy return false moze dzialac w metodzie __set ?
Forum PHP.pl > Forum > PHP > Object-oriented programming
marekc12
  1.  
  2. class Uzytkownik
  3. {
  4. public $dane = array();
  5.  
  6. function __set($parametr, $wartosc)
  7. {
  8. switch ($parametr)
  9. {
  10. case 'id':
  11. if(!sprawdzCzyliczbaNaturalna($wartosc)) throw new Exception();
  12. break;
  13. case 'mail':
  14. if(!(filtrMail($wartosc))) return false;
  15. break;
  16. case 'haslo':
  17. if( !( strlen($wartosc) >= 8 && strlen($wartosc) <= 32 ) )return false;
  18. $wartosc = $this->szyfrujHaslo($wartosc);
  19. break;
  20. default:
  21. throw new Exception();
  22. }
  23.  
  24. $this->dane[$parametr] = $wartosc;
  25. }
  26.  
  27. function zapisz()
  28. {
  29. if(isset($this->dane[id]))
  30. {
  31. wyslijZapytanie("UPDATE users SET ".pobierzListeDanych($this->dane)." WHERE id=$this->dane[id]");
  32. }
  33. else
  34. {
  35. $this->dane[data] = date("m.d.y");
  36.   wyslijZapytanie("INSERT INTO users (id,mail,haslo,data) VALUES ('','0','".$this->dane[mail]."','".$this->dane[haslo]."','".$this->dane[data]."')");
  37. }
  38. }
  39.  
  40. function usun()
  41. {
  42. wyslijZapytanie("DELETE FROM users WHERE id=$this->dane[id])");
  43. }
  44.  
  45. function wczytaj()
  46. {
  47. if(count($this->dane))
  48.   $wynik = wyslijZapytanieSelect("SELECT id,mail,haslo,data FROM users WHERE ".pobierzListeDanych($this->dane));
  49. else
  50.   $wynik = wyslijZapytanieSelect("SELECT id,mail,haslo,data FROM users");
  51.  
  52.   return $wynik;
  53. }
  54.  
  55. function szyfrujHaslo($haslo)
  56. {
  57. if( !( strlen($haslo) >= 8 && strlen($haslo) <= 32 ) )
  58. die('Dostalem haslo z bledna iloscia znakow!');
  59.  
  60. $haslo = sha1( $haslo.'yk[d' );
  61.  
  62. return $haslo;
  63. }
  64. }
  65.  
  66.  
  67.  


  1.  
  2. if (count($_POST))
  3. {
  4. $bledy = array();
  5.  
  6.  $Mail = filtrZmienna($_POST['Mail']);
  7.  $Haslo = filtrZmienna($_POST['Haslo']);
  8.  
  9. $uzytkownikSprawdz = new Uzytkownik;
  10. if( $uzytkownikSprawdz->mail=$Mail )
  11. {
  12. if( count( $uzytkownikSprawdz->wczytaj() ) !== 0 )
  13.   $bledy[]='Mail';
  14. }
  15. else
  16.   $bledy[]='Mail';
  17.  
  18. if(empty($bledy))
  19. {
  20. $uzytkownikNowy = new Uzytkownik;
  21. if( ($uzytkownikNowy->mail = $Mail) && ($uzytkownikNowy->haslo=$Haslo) )
  22. $uzytkownikNowy->zapisz();
  23.   else $wyswietlFormularz = true;
  24. }
  25. else
  26. $wyswietlFormularz = true;
  27. }
  28. else
  29. $wyswietlFormularz = true;
  30.  
  31.  





Witam,

powyzej zamiscilem kod ktory pisalem sobie na wlasne potrzeby do tworzenia,usuwania,edytkowania uzytkownikow w bazie danych. Nie jestem bardzo doswiadczony w rozwiazaniach obiektowych. 

Kombinowałem sobie w taki sposob zeby w klasie Uzytkownik poprzez funckcje __set sprawdzac wszystkie wprowadzane dane i ona przy wprowadzaniu jakiejs danej zwracalaby true lub false w zaleznosci od tego czy dana byla poprawna: 

if( !($uzytkownikNowy->mail = $Mail) echo "Wprowadzono niepoprawny adres e-mail";

Niestety nie działa sad.gif Myslalem ze moge tak zrobic i z tego "($uzytkownikNowy->mail = $Mail)" wyjdzie false... niestety mimo polecenia "return false;" w metodzie __set nie zwraca ona false.




Da sie jakos to zrobic zeby ($uzytkownikNowy->mail = $Mail) zwrocilo false lub true , jezeli wiecie o co mi chodzi?? Czy musze sobie zrobic inna metode odpowiedzialna za wprowadzanie wartosci do klasy?
LBO
Wprowadź mutatory (a idąc za ciosem akcesory), czyli metody stworzone specjalnie do wprowadzania danych do obiektu.

  1. if($user->setMail($mail)) echo "Wprowadzono niepoprawny adres e-mail";
-=Peter=-
Możesz zaimplementować magiczną metodę __isset i po próbie ustawieniu tego meila, sprawdzać czy faktycznie został on ustawiony. Jednakże jest to dodatkowa linijka kodu. Możesz również wyrzucać wyjątek w metodzie __set jeśli podano niepoprawne dane.

  1. //w definicji klasy
  2. //ciach
  3. public function __isset($name){
  4. return isset($this->dane[$name]);
  5. }
  6. //ciach
  7.  
  8. $user->mail = $mail;
  9. if(!isset($user->mail)){
  10. echo 'podano niepoprawny mail';
  11. }
erix
Ostatecznie możesz wysypywać wyjątek przy próbie wprowadzenia błędnych danych. Obejdzie się bez mutatorów, których osobiście nie znoszę. tongue.gif
marekc12
Też mi się nie podoba użycie oddzielnej funkcji dla każdej jednej wprowadzanej zmiennej (mutatory) ... Ale chyba to jednak najlepsze wyjście, poniważ jak będę z zewnątrz klasy Uzytkownik wprowadzał każdą jedną zmienną do klasy to będę za każdym razem wiedział czy została ona przyjęta. A jak zrobię wyjątki to już przy pierwszej błędnej zmiennej kod zostanie zatrzymany...
A ja chciałem powiedzieć użytkownikowi które pola w formularzu źle podał, a nie tylko pierwsze pole które podał źle.

Z drugiej strony mógłbym sprawdzać to przed wrzuceniem do klasy... Ale od tego jest klasa, że to się sprawdzało w niej...
Jak z kilku różnych miejsc w kodzie będę wrzucał do tej klasy zmienne to lepiej żeby tam w środku było weryfikowane niż za każdym razem na zewnątrz (łatwo się pomylić i zapomnieć zweryfikować).

Mam nadzieje, że zrozumieliście co napisalem, bo troche zamotałem chyba smile.gif))

Chyba mutatory wykorzystam.
phpion
Tworzenie setterów/getterów jest strasznie upierdliwe. Gdy dodamy do tego jeszcze komentowanie to staje się to jeszcze bardziej upierdliwe. Nie zmienia to jednak faktu, że chyba warto je pisać. Mamy wówczas pełną kontrolę nad wypełnianiem obiektów danymi. Tworząc w setterze $this->pole = (string)$wartosc; mamy pewność, że zawsze będzie tam siedział string. Nie wspomnę już o wymuszeniach typu (set_pole(Moj_Obiekt $wartosc)). Tak więc moim zdaniem warto poświęcić nieco czasu na utworzenie setterów/getterów nawet jeśli mają po prostu ograniczać się do return $this->pole.
erix
Cytat
Z drugiej strony mógłbym sprawdzać to przed wrzuceniem do klasy... Ale od tego jest klasa, że to się sprawdzało w niej...
Jak z kilku różnych miejsc w kodzie będę wrzucał do tej klasy zmienne to lepiej żeby tam w środku było weryfikowane niż za każdym razem na zewnątrz (łatwo się pomylić i zapomnieć zweryfikować).

Zawsze możesz użyć interfejsu ArrayAccess. Będziesz miał wówczas wszystko wydzielone i bez problemu sprawdzisz. A i chyba szybciej działa niż settery/gettery. winksmiley.jpg
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.