Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Błąd: Kontrola typów danych
Forum PHP.pl > Forum > PHP > Object-oriented programming
Aztech
Pytałem się swego czasu w tym wątku o kontrolę typów danych i zostałem namówiony do jej używania, problem który pojawił się w prawktyce jest następujący:

w klasie bazowej użytkownika mam:

  1. <?php
  2.  
  3. public function __construct($rbx_db, string $nick, string $email) {
  4.  
  5. #inicjacja połaczenia AdoDB poprzez wyłołanie konstruktora rodzica
  6. parent::__construct($rbx_db);
  7.  
  8. if (!empty($email)){
  9. if (!empty($nick)){
  10. /* wycęty kod */
  11. }
  12. else throw new UserException(CUE_NICK_EMPTY);
  13. }
  14. else throw new UserException(CUE_EMAIL_EMPTY);
  15. }
  16.  
  17. ?>


w skypcie pobierającym dane z forumularza mam wywołąnie tego konstruktora w linii numer 6 (listing poniżej). Parser wywala mi taki błąd
Kod
Fatal error: Argument 2 must be an object of class string in C:\usr\krasnal\www\robotECS\classes\user.php on line 120

Uwaga: tutaj jest to linia numer 3 w listingu wyżej.
Dlaczego tak się dzieje mimo tego, że wartości wpisane w pole formularza są stringiem?
  1. <?php
  2.  
  3. if (!$error_found) {
  4. //if every field is set
  5. try {
  6. $user = new User($rbx_db, $_POST["reg_nick"],$_POST["reg_email"]);
  7. $user->setName($_POST["reg_fname"]." ".$_POST["reg_lname"]);
  8. $user->setPassword($_POST["reg_pass"]);  
  9. $user->setGG($_POST["reg_gg"]);
  10. $user->setPhone($_POST["reg_phone"]);
  11. $user->setPhoto($_POST["reg_photo"]);
  12. $user->setIcq($_POST["reg_icq"]);
  13. $user->setTlenId($_POST["reg_tlen_id"]);
  14. //$user->setDescription("");
  15. $user->createUserSQL(1/* getLastUserID()*/);
  16. $correct = true;
  17. }
  18. catch (UserException $e){  
  19. switch ($e->getMessage()) {
  20. /* wyciety kod */
  21. }
  22. $e_msg .= $e->getMessage();  
  23. }
  24. catch (IllegalDataException $e) {
  25. switch ($e->getMessage()) {
  26. /* wyciety kod */
  27. }
  28. $e_msg .= $e->getMessage();  
  29. }
  30. catch (SqlException $e) {
  31. switch ($e->getMessage()) {
  32. /* wyciety kod */
  33. }
  34. $e_msg .= $e->getMessage();  
  35. }
  36. catch (Exception $e) {
  37. echo 'Unknown error!'.$e->getMessage();
  38. }
  39. }
  40.  
  41. ?>
matid
Niestety, w php type hinting odnosi się tylko i wyłącznie do obiektów i AFAIR tablic.
Jeśli chcesz mieć dokładniejszą kontrolę typów danych musisz sobie zaimplementować klasy String, Integer, itd. i używać ich zamiast zwykłych stringów i integerów.
Ma to swoje wady i zalety, czy chcesz z tego korzystać - przemyśl to sam.
dr_bonzo
madit juz ci wyjasnil.
Ja tylko dodam:
1. skoro uzywasz wyjatkow to nie zagniezdzaj tak jakbys ich nie uzywal
  1. <?php
  2. if (!empty($email)){
  3. if (!empty($nick)){
  4. /* wycęty kod */
  5. }
  6. else throw new UserException(CUE_NICK_EMPTY);
  7. }
  8. else throw new UserException(CUE_EMAIL_EMPTY);  
  9. ?>

  1. <?php
  2. if ( empty($email)) // << brak !
  3. {
  4. throw new UserException(CUE_EMAIL_EMPTY);  
  5. }
  6. if ( empty($nick)) // << brak !
  7. {
  8. throw new UserException(CUE_NICK_EMPTY);
  9. }
  10.  
  11. ?>

uzyskasz mniej zagniezdzen, spowodowanych TYLKO przez kontrole argumentow.

2. Nie przekazuj nie istniejacych zmiennych
  1. <?php
  2. $user->setName($_POST["reg_fname"]." ".$_POST["reg_lname"]);
  3. ?>

najpierw sprawdz czy $_POST[ '...' ] istnieje.
Aztech
A jest gdzieś jakiś artykuł na te temat? I przy okazji co to są te tablice AFAIR?

@dr_bonzo: sprawdzam czy nie są puste, tutaj by nie zaśmiecać kodu niepotrzebnymi informacjami wyciąłem (jak widać jest tam komentarz: if every field is set biggrin.gif )
dr_bonzo
LOL
AFAIR - As Far As I Remember -- jak pamietam to...

http://pl.php.net/language.oop5.typehinting
http://www.gadgetopia.com/post/4667


IITYIWHTKU
http://home.tiscali.be/lexicon/chat.htm
biggrin.gif
Aztech
[OT mode on]
IMHO, LOL, BTW, EOT itp itd ale AFAIR nie znałem smile.gif i wyszedłem na niezłą lamę smile.gif Człek się uczy całe życie
[OT mode off]

EDIT: @dr_bonzo: dzięki za linka uświadamiająco-edukacyjnego smile.gif
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.