Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Bezpieczeństwo dwóch warunków w if
Forum PHP.pl > Forum > Przedszkole
Rysh
Witam, mam pytanie dotyczące bezpieczeństwa używania 2 funkcji w if. Otóż chciałbym użyć czegoś takiego:
  1. if($this->form_validation->run() == TRUE && $this->mu->addServer($this->input->post())){
  2. redirect('/muonline');
  3. } else {
  4. $this->load->view('muonline/formAdd');
  5. }

Gdzie form_vaidation weryfikuje dane, natomiast addServer dodaje już wpis do bazy danych.
Jednak drugie bez pierwszego nie ma prawa się wykonać, mógłbym to zagnieździć w kolejnym if - jednak ciekawi mnie, czy forma o którą pytam jest dozwolona czy lepiej jej unikać.
Wykonałem test polegający na funkcji:
  1. function a() {
  2. echo 'test';
  3. return TRUE;
  4. }
  5. if(FALSE == TRUE && a==TRUE) {
  6. $nic = '';
  7. }

Druga funkcja nie jest wykonywana, mimo wszystko wole zapytać.

Pozdrawiam.
trueblue
W drugim przypadku nie wywołujesz funkcji a, lecz porównujesz ją ze stałą.

Wszystkie warunki w "płaskim" if są sprawdzanie (na podstawie pierwszego nie można stwierdzić prawdziwości całości), chyba, że parser optymalizuje takie zapytanie do zagnieżdżonego, ale tego nie wiem.
Nie ma znaczenia czy jest to "płaski" if czy zagnieżdżona struktura, przynajmniej z punktu widzenia wydajności.
Rysh
Cytat(trueblue @ 22.11.2014, 20:42:10 ) *
W drugim przypadku nie wywołujesz funkcji a, lecz porównujesz ją ze stałą.

Wszystkie warunki w "płaskim" if są sprawdzanie (na podstawie pierwszego nie można stwierdzić prawdziwości całości), chyba, że parser optymalizuje takie zapytanie do zagnieżdżonego, ale tego nie wiem.
Nie ma znaczenia czy jest to "płaski" if czy zagnieżdżona struktura, przynajmniej z punktu widzenia wydajności.

Faktycznie, mój błąd powinno być a();
Jednak po zmianie na funkcję wykonanie funkcji nienastąpiło.
trueblue
Czyli pewnie następuje optymalizacja, skoro całość jest AND, nie ma sensu sprawdzać reszty.
A z ciekawości, wrzuć: X AND Y OR Z. Gdzie Z jest funkcją zwracającą true.
Rysh
  1. function a(){ echo 'a<br />'; return TRUE; }
  2. function b(){ echo 'b<br />'; return TRUE; }
  3. function c(){ echo 'c<br />'; return TRUE; }
  4. if(a()==TRUE && b()==FALSE || c()==TRUE){
  5. echo 'done';
  6. }

Zwraca:
Cytat
a
b
c
done


Natomiast:
  1. function a(){ echo 'a<br />'; return TRUE; }
  2. function b(){ echo 'b<br />'; return TRUE; }
  3. function c(){ echo 'c<br />'; return TRUE; }
  4. if(a()==FALSE && b()==FALSE || c()==TRUE){
  5. echo 'done';
  6. }

Daje nam:
Cytat
a
c
done

Wg tego małego eksperymentu mogę powiedzieć, że jeśli stoji znak AND i warunek pierwszy niezostanie spełniony, kompilator porzuca wykonanie kolejnej funkcji.
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.