Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: return false + opis
Forum PHP.pl > Forum > PHP
shimano
Witam.

Zastanawiam sie, jak zrobic, aby funkcja w przypadku bledu zwracala wartosc NULL lub FALSE i jednoczesnie komunikat bledu?

Cos na styl:
  1. function funkcja() {
  2. // kod (..)
  3. if(!$a) {
  4. return (FALSE, "Wystapil blad!");
  5. }
  6. return TRUE;
  7. }
  8.  
  9. $i = funkcja();
  10. if(!$i) {
  11. echo $i;
  12. }
  13. else {
  14. echo "Wszystko w porzadku, dzialam dalej...";
  15. }


Oczywiscie cos takiego nie dziala, ale mysle, ze dobrze obrazuje to co, chce osiagnac.
#luq
W funkcjach zastosuj sobie jeden parametr który będzie referencją na zmienną z teksem komunikatu
  1. function a( $param, &$err ){
  2. if( !$param ){
  3. $err = 'Jakieś info';
  4. return false;
  5. }
  6. else{
  7. return true;
  8. }
  9. }
  10.  
  11. if( !a( false, $errorText ) ){
  12. echo $errorText;
  13. }


Natomiast pisząc obiektowo masz wyjątki od tego.
krowal
I tak bóg stworzył wyjątki (Exceprions) smile.gif
  1. <?php
  2. function mojaFunkcja($param){
  3. if ($param == 'cos_jest_nie_tak'){
  4. throw new Exception('Wiadomosc bledu');
  5. }
  6. }
  7.  
  8. try{
  9. mojaFunkcja('cos_jest_nie_tak');
  10. }catch(Exception $e){
  11. echo $e->getMessage();
  12. }
  13. ?>


@#luq byłeś pierwszy smile.gif
shimano
Hm, no to ciagle nie to, o co mi chodzi... Moze jakies inne sugestie?

Edit:
Jedyne co mi przychodzi do glowy to:

  1. function funkcja() {
  2. global $errstr;
  3. // kod (..)
  4. if(!$a) {
  5. $errstr = "Wystapil blad!";
  6. return false;
  7. }
  8. return TRUE;
  9. }
  10.  
  11. $i = funkcja();
  12. if(!$i) {
  13. echo $errstr;
  14. }
  15. else {
  16. echo "Wszystko w porzadku, dzialam dalej...";
  17. }


Niestety te rozwiazanie nie jest ani zbyt ambitne, ani zbyt dobre, ani nawet najwygodniejsze... Wiec moze jakies pomysly?
krowal
A czemu nie możesz użyć do tego wyjątków ?

  1. <?php
  2. $globalErrorsArray = array();
  3.  
  4. function mojaFunkcja($param){
  5. if ($param == 'cos_jest_nie_tak'){
  6. throw new Exception('Wiadomosc bledu');
  7. }
  8. }
  9.  
  10. try{
  11. mojaFunkcja('cos_jest_nie_tak');
  12. }catch(Exception $e){
  13. $globalErrorsArray[] = $e->getMessage();
  14. }
  15. ?>


ps. deklarowanie globali w funkcji ? smile.gif bez sensu... btw. deklarowanie globali w ogóle jest bez sensu.
#luq
@krowal dobrze mówi. Chodź użycie wyjątków w kodzie proceduralnym to takie lekkie mieszanie, nie ma w tym nic złego no ale mieszanie to mieszanie winksmiley.jpg
Jeśli takie rozwiązanie Ci się nie podoba to wrzucaj kolejny parametr który będzie referencją na string (ew. tablicę) błędu (błędów) tak jak to pokazałem. Z globalem nie ma co kombinować bo tak jak wyżej napisano nie ma sensu, jest nie eleganckie i takie prostackie.
shimano
No ja powiedzialbym nawet, ze mieszanie to bardzo lekko powiedziane. Polecacie wyjatki, a czy sami ich uzywacie w skomplikowanych kodach, gdzie jest wiele warunkow? Poza tym chyba ta funkcja nie zostala stworzona konkretnie do tego, co potrzebuje wiec smialbym nawet stwierdzic, ze na dluzszy czas stosowanie wyjatkow do tego, co chce osiagnac moze byc niebezpieczne.

Tak wiec wyjatki odpadaja. Bynajmniej w takiej formie, w jakiej obecnie PHP je zawiera.

A co do zmiennych globalnych. Pisalem, ze nie jest to dobre wyjscie, ani ladne, ani madre, itp. Ale tez nie jest bardzo bardzo zle, czy smiertelnie niebezpieczne. Zwlaszcza, ze w tym przypadku taka globalna zmienna zawiera tylko string do wyswietlania. Nie ma na niej zadnych innych operacji.

Swoja droga to az dziwne, ze chlopaki z PHP nie wprowadzili do tej pory mozliwosci zwrotu "wartosci" wraz z typem true albo false.

P.S.
Uprzedzajac ewentualna kolejna propozycje...
Poza zmiennymi globalnymi jeszcze moznaby zastosowac zwrot tablicy. Owszem, rozwiazanie lepsze od globali. Ale tak samo srednio wygodne.
230005
Cytat
Poza tym chyba ta funkcja nie zostala stworzona konkretnie do tego, co potrzebuje


To moim zdaniem źle potrzebujesz winksmiley.jpg.

Cytat
wiec smialbym nawet stwierdzic, ze na dluzszy czas stosowanie wyjatkow do tego, co chce osiagnac moze byc niebezpieczne.


Jakim cudem miałoby to być niebezpieczne? Rzucasz wyjątek - blok kodu zostaje przerwany - skrypt idzie dalej.

Cytat
Swoja droga to az dziwne, ze chlopaki z PHP nie wprowadzili do tej pory mozliwosci zwrotu "wartosci" wraz z typem true albo false.


A znasz jakiś język, w którym coś takiego jest? W sumie to nawet ciężko mi byłoby sobie coś takiego wyobrazić. Tzn. jak według ciebie miałoby to wyglądać? Z resztą kurde - po to są właśnie wyjątki - jak jakiś zostanie wypluty, to albo drukujesz komunikat błędu i przechodzisz dalej, albo w bloku catch drukujesz komunikat błędu i dajesz kod obsługujący taką sytuację...
krowal
Cytat(shimano @ 28.09.2009, 19:40:52 ) *
Swoja droga to az dziwne, ze chlopaki z PHP nie wprowadzili do tej pory mozliwosci zwrotu "wartosci" wraz z typem true albo false.


W ostateczności możesz zrobić tak że funkcja zwraca true albo jakąś wiadomość:
  1. <?php
  2. function test($param){
  3. if ($param){
  4. return true;
  5. }else{
  6. return 'niestety wyskoczyl blad';
  7. }
  8. }
  9.  
  10. $valid = test(false);
  11. if ($valid !== true){ //WAZNE! zwróć uwagę na operator porównania ze sprawdzaniem typów "!== , ==="
  12. echo $valid;
  13. }
  14. ?>

W Twoim przypadku zupełnie wystarczy smile.gif

Ja jednak nadal upieram się przy wyjątkach, i twoje pytanie czy korzysta się z nich w skomplikowanym kodzie = tak korzysta się, chyba w każdym frameworku masz błędy obsługiwane przez wyjątki.
Jeśli będziesz już wiedział jak one działają i jak można je przechwytywać to zobaczysz o co chodzi 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.