Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zwracanie wartości przez metody
Forum PHP.pl > Forum > PHP
Zagiewa
Witam. Mam pewien problem ze zwracaniem wartości przez metody. W przypadku zwykłych funkcji jest to dość proste bo w funkcji robię return $zmienna; i zmienna ta trafia do miejsca wywołania funkcji i można w dalszej części kodu z niej korzystać prawda? Przynajmniej u mnie to działa tongue.gif Problem mam jak chcę zrobić dokładnie to samo w metodzie. Robię dokładnie tak:
  1. $email = $_POST['email'];
  2. $nowy->walidacja_email($email);
  1. public function walidacja_email($email) {
  2. if (!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$", $email)) {
  3. echo "Wprowadzony adres email jest niepoprawny!";
  4. $email = 0;
  5. }else {
  6. $email = 1;
  7. }
  8. return $email;
  9. }
Zmienna $email trafia do metody bez problemu. Metoda działa również bez problemu ale gdy w dalszej części kodu sprawdzam wartość $email to ma ona wartość wprowadzoną z formularza zamiast tą zwróconą przez metodę. Spróbowałem więc inaczej. Utworzyłem zmienna $email_ok gdzie dałem jej wartość 0 albo 1 i zwróciłem return $email_ok ale gdy dałem echo wewnątrz metody z tą funkcją i w dalszej części kodu to zmienna ta miała przypisaną wartość tylko w metodzie dalej już była pusta dlaczego?
Quadina
Kłaniają się podstawowe definicje o metodach, referencjach i zmiennych. Zmienna $email w metodzie staje się jej lokalną, a więc po za nią niestety się nic nie zmieni. Zwracasz return, a więc nie zmieniasz danej, którą do metody przekazujesz, ale otrzymujesz zupełnie nową zmienną. Rozwiązanie na Twoją myśl przedstawie na dwóch przykładach, które dadzą ten sam efekt, ale nie wiem, którą wersję będziesz chciał i rozumiał:

  1. // przez zwracanie wartości zmiennej i przepisanie jej później w kodzie głównym
  2. class waliduj{
  3. public function walidacja_email($email) {
  4. return eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$", $email);
  5. }
  6. }
  7. $nowy = new waliduj;
  8. $email = $_POST['email'];
  9. $email = $nowy->walidacja_email($email);
  10. echo $email; // zwroci odpowiednio 0,1 [false/true];
  11.  
  12. // albo przez dodanie znaczka & w definicji funkcji, dzięki czemu będziesz mieć referencje, a co za tym idzie zmienna $email zrobi się jakby globalna w tym miejscu
  13. class waliduj{
  14. public function walidacja_email(&$email) {
  15. $email = eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$", $email);
  16. }
  17. }
  18. $nowy = new waliduj;
  19. $email = $_POST['email'];
  20. $nowy->walidacja_email($email);
  21. echo $email; // zwroci odpowiednio 0,1 [false/true];


Efekt podobny - dwa rodzaje rozwiązania. Mam nadzieje, że rozumiesz gdzie zrobiłeś błąd. W razie co pisz, to postaram się tłumaczyć inaczej smile.gif A jak pomogłem to proszę o punkcik ;-)
ADeM
Poczytaj o zasięgu zmiennych.
Zagiewa
W formie wyjaśnień dodam, że ciągle raczkuje w obiektowości tongue.gif Co do pierwszego przykładu to rozumiem i na pewno z niego skorzystam smile.gif Co do drugiego to zastosować mogę ale tego nie zrobię ponieważ jeszcze nie uczyłem się o referencjach więc wiem mniej więcej tylko co to jest dlatego bez sensu było by wklepywać kod którego nie do końca czaje. Tak czy inaczej dzięki za szybką i treściwą odpowiedz. Oczywiście punkcik będzie winksmiley.jpg
jang
Jeśli masz PHP >= 5.2.0 to
  1. class Waliduj{
  2. public function walidacja_email($email) {
  3. $email = filter_var(filter_var($email, FILTER_SANITIZE_EMAIL), FILTER_VALIDATE_EMAIL);
  4. if($email === false) {
  5. die(Houston, we have a problem....);
  6. } else {
  7. return true;
  8. }
  9. }
  10. }
albo
  1. class Waliduj{
  2. public function walidacja_email($email) {
  3. $email = filter_var(filter_var($email, FILTER_SANITIZE_EMAIL), FILTER_VALIDATE_EMAIL);
  4. if($email != false) {
  5. return true;
  6. }
  7. }
  8. }
albo
  1. class Waliduj{
  2. public function walidacja_email($email) {
  3. // tutaj zwróci albo FALSE albo prawidłowy email
  4. return $email = filter_var(filter_var($email, FILTER_SANITIZE_EMAIL), FILTER_VALIDATE_EMAIL);
  5. }
  6. }
Mephistofeles
Return nie oznacza, że zmienna wraca do miejsca wywołania funkcji. Dzięki return funkcja zwraca wartość, czyli można przypisać to do zmiennej.
  1. $email = walidacja($email);
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.