Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zwracanie wartości przez metody
Zagiewa
post
Post #1





Grupa: Zarejestrowani
Postów: 84
Pomógł: 0
Dołączył: 12.08.2009

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
Quadina
post
Post #2





Grupa: Zarejestrowani
Postów: 200
Pomógł: 38
Dołączył: 1.12.2010
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/smile.gif) A jak pomogłem to proszę o punkcik ;-)

Ten post edytował Quadina 3.12.2010, 13:44:00
Go to the top of the page
+Quote Post
ADeM
post
Post #3





Grupa: Zarejestrowani
Postów: 455
Pomógł: 69
Dołączył: 23.10.2004
Skąd: Oświęcim

Ostrzeżenie: (0%)
-----


Poczytaj o zasięgu zmiennych.
Go to the top of the page
+Quote Post
Zagiewa
post
Post #4





Grupa: Zarejestrowani
Postów: 84
Pomógł: 0
Dołączył: 12.08.2009

Ostrzeżenie: (0%)
-----


W formie wyjaśnień dodam, że ciągle raczkuje w obiektowości (IMG:style_emoticons/default/tongue.gif) Co do pierwszego przykładu to rozumiem i na pewno z niego skorzystam (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
jang
post
Post #5





Grupa: Zarejestrowani
Postów: 101
Pomógł: 11
Dołączył: 2.02.2005

Ostrzeżenie: (0%)
-----


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. }
Go to the top of the page
+Quote Post
Mephistofeles
post
Post #6





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

Ostrzeżenie: (0%)
-----


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);
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 04:01