Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: E_NOTICE przy switch
Forum PHP.pl > Forum > PHP
ladovnik
Witam. Mam taki oto switch:
  1. <?php
  2. switch($_GET['number']){
  3. case 1: echo "Liczba to 1!"; break;
  4. default: echo "Blad"; break;
  5. }
  6. ?>


I PHP wyrzuca mi błąd:
Cytat
Error type: Notice error
Error message: Undefined index: number


Przecież to bez sensu, po to jest default, aby w przypadku nie istnienia zmiennej number wyświetlić ustalony tekst... Co Wy na to?


Pozdrawiam,
ladovnik
kefirek
Od sprawdzenia czy zmienna istnieje jest isset" title="Zobacz w manualu PHP" target="_manual a defalut jest od tego by wyświetlić domyślny tekst w przypadku nie spełniania się żadnego z warunków
ladovnik
Generalnie tak, ale robienie:
  1. <?php
  2. if(isset($_GET['number'])){
  3. switch($_GET['number']){
  4. case 1: echo "Liczba to 1!"; break;
  5. default: echo "Blad"; break;
  6. }
  7. }
  8. ?>

Jest dość niewygodne... Wtedy już lepiej robić:
  1. <?php
  2. if(isset($_GET['number']) && $_GET['number']==1) echo "Liczba 1!";
  3. elseif(isset($_GET['number']) && $_GET['number']==2) echo "Liczba 2!";
  4. else echo "blad";
  5. ?>


I w takiej sytuacji funkcja switch dla zmiennych GET staje się nieużyteczna (jeśli chcemy mieć poprawnie napisany skrypt)...
bełdzio
daj na poczatku kodu
  1. <?php
  2. error_reporting(E_ALL ^ E_NOTICE);
  3. ?>
phpion
Cytat(ladovnik @ 3.03.2009, 22:24:14 ) *
I w takiej sytuacji funkcja switch dla zmiennych GET staje się nieużyteczna (jeśli chcemy mieć poprawnie napisany skrypt)...

Wszystko jest bezużyteczne jeśli nie potrafisz się tym sprawnie posługiwać. Podobnie jest i w tym przypadku. Pomimo, że kefirek świetnie wyjaśnił ci różnicę między isset a default to ty nadal upierasz się przy swoim. Twój kod będzie rzucał notice'ami z racji twojego niedbalstwa, a nie przez "bugi" w instrukcji switch-case.
ladovnik
Bełdzio, ja celowo włączyłem pokazywanie błędów E_NOTICE, bo chcę mieć skrypt 100% zgodny... Co do wypowiedzi phpion, przecież zrozumiałem różnicę pomiędzy isset a default.. co też zaprezentowałem w swoim przykładzie, w moim drugim poście. Przecież innej metody nie ma, poza tymi dwoma, przedstawionymi przez mnie w drugim poście. Jeśli się mylę - proszę mnie poprawić.
phpion
No ale twierdzenie, żę switch-case jest bezużyteczny to lekkie przegięcie... wystarczy taka konstrukcja:
  1. <?php
  2. $number = isset($_GET['number']) ? $_GET['number'] : 1;
  3.  
  4. switch ($number) {
  5.  
  6. }
  7. ?>
ladovnik
Cóż, wybacz phpion, nie pomyślałem o takim rozwiązaniu.

Pozdrawiam,
ladovnik
Crozin
Cytat(kefirek @ 3.03.2009, 20:21:39 ) *
a defalut jest od tego by wyświetlić domyślny tekst w przypadku nie spełniania się żadnego z warunków

A dafault służy do wykonania się zawsze. A to czy inne warunki się spełniły nie ma nic do rzeczy. winksmiley.jpg
piaseq
Cytat(Crozin @ 4.03.2009, 00:11:52 ) *
A dafault służy do wykonania się zawsze. A to czy inne warunki się spełniły nie ma nic do rzeczy. winksmiley.jpg

Chyba czytaliśmy inne manuale:
Cytat
A special case is the default case. This case matches anything that wasn't matched by the other cases.
switch
Crozin
Tylko w przypadku, gdy wewnątrz switcha przed default zostanie wykonane break" title="Zobacz w manualu PHP" target="_manual.
piaseq
Cytat(Crozin @ 4.03.2009, 00:41:24 ) *
Tylko w przypadku, gdy wewnątrz switcha przed default zostanie wykonane break" title="Zobacz w manualu PHP" target="_manual.

Oczywiście masz rację, ale nie zmienia to faktu, że w opisie instrukcji switch kończenie break-iem bloku instrukcji po case przedstawione jest jako zachowanie domyślne. Pominięcie break'a i zezwolenie na wykonanie bloków instrukcji przypisanych do kilku case'ów i/lub defaulta jest z założenia celowym i świadomym zabiegiem programisty.
Crozin
Cytat
przedstawione jest jako zachowanie domyślne
Wiem, że się czepiam, ale: nie jest to domyślne zachowanie, bo jeżeli takowe by było, to w kodzie zapewne break by się pomijało, a stosowało inne słowo kluczowe do "kontynuowania". Nie zmienia to faktu, że jest to bardzo popularne zachowanie.
Cytat
jest z założenia celowym i świadomym zabiegiem programisty
Podobnie jak celowym założeniem programisty powinna być wiedza na temat tego co się pisze, a nie używa breaka "bo tak w manualu napisali". winksmiley.jpg

Koniec OTa
nospor
@Crozin nie dość ze sie czepiasz to jeszcze dziwne rzeczy wygadujesz smile.gif

default wykona sie zawsze jesli nie podamy nigdzie break. Ale tak samo wykona sie kazdy inny case jesli weszlo sie do case wczesniej i nie dalo sie break. default zachowuje sie tu tak samo jak normalny case.

default to taki else z if. wykona sie wtedy, gdy nie spelnionone są inne warunki. Mieszanie w to ideologii z break mija się z celem, a juz tym bardziej mija sie z celem mowienie komus ze gada bzdury bo uzywa niby bezmyslnie to co napisali w manualu. piaseq dobrze zrozumial manuala i dobrze uzywa to co tam napisali.

break sluzy do niewykonywania instrukcji z innych case'ów (w tym i default). z reguły tak robimy najczęściej.
Zdarzają sie jednak sytuacje, gdy chcemy by dane instrukcje wykonaly sie dla kilku case i wowczas nie dajemy break. I jak napisal piaseq jest to celowym i swiadomym działaniem programisty


porownówam troche twoj tekst o tym ze default wykonuje sie zawsze, no chyba ze damy break, do takich tekstów:
samochod moze jechac bez konca i bez postojów, no chyba ze mu sie skonczy paliwo
swiatlo w lodówce pali się zawsze, no chyba ze zamkniemy lodówke
winksmiley.jpg
Crozin
Cytat
default wykona sie zawsze jesli nie podamy nigdzie break. Ale tak samo wykona sie kazdy inny case jesli weszlo sie do case wczesniej i nie dalo sie break. default zachowuje sie tu tak samo jak normalny case.
No przecież nie napisałem, że tak nie jest smile.gif

Przyczepiłem się do
Cytat
a defalut jest od tego by wyświetlić domyślny tekst w przypadku nie spełniania się żadnego z warunków
Co nie jest do końca zgodne z prawdą.

Fakt, faktem - break w parze z case(ami) używa się nieporównanie częściej niż bez nich, a default przymuje rolę wspomnianego else, ale nie można napisać tak jak kefirek
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.