Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> E_NOTICE przy switch
ladovnik
post
Post #1





Grupa: Zarejestrowani
Postów: 60
Pomógł: 1
Dołączył: 25.11.2008
Skąd: Polska

Ostrzeżenie: (10%)
X----


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

Ten post edytował ladovnik 3.03.2009, 20:18:03
Go to the top of the page
+Quote Post
kefirek
post
Post #2





Grupa: Zarejestrowani
Postów: 781
Pomógł: 256
Dołączył: 29.06.2008

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


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

Ten post edytował kefirek 3.03.2009, 20:24:15
Go to the top of the page
+Quote Post
ladovnik
post
Post #3





Grupa: Zarejestrowani
Postów: 60
Pomógł: 1
Dołączył: 25.11.2008
Skąd: Polska

Ostrzeżenie: (10%)
X----


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)...

Ten post edytował ladovnik 3.03.2009, 20:26:39
Go to the top of the page
+Quote Post
bełdzio
post
Post #4





Grupa: Zarejestrowani
Postów: 690
Pomógł: 81
Dołączył: 6.04.2005
Skąd: Szczecin

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


daj na poczatku kodu
  1. <?php
  2. error_reporting(E_ALL ^ E_NOTICE);
  3. ?>
Go to the top of the page
+Quote Post
phpion
post
Post #5





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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





Grupa: Zarejestrowani
Postów: 60
Pomógł: 1
Dołączył: 25.11.2008
Skąd: Polska

Ostrzeżenie: (10%)
X----


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





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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. ?>
Go to the top of the page
+Quote Post
ladovnik
post
Post #8





Grupa: Zarejestrowani
Postów: 60
Pomógł: 1
Dołączył: 25.11.2008
Skąd: Polska

Ostrzeżenie: (10%)
X----


Cóż, wybacz phpion, nie pomyślałem o takim rozwiązaniu.

Pozdrawiam,
ladovnik
Go to the top of the page
+Quote Post
Crozin
post
Post #9





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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. (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
piaseq
post
Post #10





Grupa: Zarejestrowani
Postów: 161
Pomógł: 25
Dołączył: 6.09.2008
Skąd: Warszawa

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


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. (IMG:http://forum.php.pl/style_emoticons/default/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
Go to the top of the page
+Quote Post
Crozin
post
Post #11





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Tylko w przypadku, gdy wewnątrz switcha przed default zostanie wykonane break" title="Zobacz w manualu PHP" target="_manual.
Go to the top of the page
+Quote Post
piaseq
post
Post #12





Grupa: Zarejestrowani
Postów: 161
Pomógł: 25
Dołączył: 6.09.2008
Skąd: Warszawa

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


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





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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". (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Koniec OTa
Go to the top of the page
+Quote Post
nospor
post
Post #14





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@Crozin nie dość ze sie czepiasz to jeszcze dziwne rzeczy wygadujesz (IMG:http://forum.php.pl/style_emoticons/default/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
(IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
Crozin
post
Post #15





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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 (IMG:http://forum.php.pl/style_emoticons/default/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
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: 19.09.2025 - 23:21