php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2007

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 19.07.2007, 21:35  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard switch-Wunder? Kopf raucht! Bahnhof!!

Hi,

folgender Code:
PHP-Code:
<?php
    
public function transform($key$value)
    {
        list (
$line$colname) = $key;    
        switch (
$colname) {
        case 
'hu':
        case 
'au':
        case 
'ez':
            
// input(mm.yyyy) -> output(yyyy-mm-01)
            
var_dump("328§&%§/§VSFW"$colnamegettype($colname)); exit;
?>
Folgende Ausgabe:
Code:
string(16) "328§&%§/§VSFW" int(0) string(7) "integer"
Ist das ein Bug? Die komischen Zeichen im 1. Parameter von var_dump() sind nur zur Versicherung, dass ich mich auch wirklich im richtigen Codeblock befinde (denke diese Debug-Ausgabe ist also eindeutig).

Wie kann es sein, dass $colname = 0 ist, wenn doch eindeutig nur die case 'hu', 'au' und 'ez' in diesen switch-Block gelangen dürfen?

Mal abgesehen davon, das Ergebnis ist reproduzierbar:
PHP-Code:
<?php
$colname 
0;
switch (
$colname) {
case 
'hu':
case 
'au':
case 
'ez':
    
var_dump($colname);
    break;
}
?>
Darf ein in switch abgeprüftes Elemente nicht 0 oder FALSE sein? Seit wann das denn?!
Zergling-new ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 19.07.2007, 21:40  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Hm Auto-Typecast offenbar, (int)0 === (int)(string)'hu'
Jetzt muss ich nurnoch herausfinden, warum eine Spalte den Namen 0 hat.
Zergling-new ist offline  
Alt 19.07.2007, 21:58  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Hab die Geschichte gerade auch in den User Notes gefunden
http://de3.php.net/manual/en/control...itch.php#59991

php wandelt wohl die case Werte in den Typ der in switch () angegeben Variable um. Und (int) von jeglichem String, der keine Ziffer beinhaltet ist dann 0.

Für alle Fauzlpelze, die Lösung für obiges Problem wäre dann:
PHP-Code:
<?php
switch($colname
  {
  case 
$colname === 'hua':
  case 
$colname === 'au':
  case 
$colname === 'ez':
    
// ... do something useful
  
}
?>
nikosch ist gerade online  
Alt 19.07.2007, 23:16  
Erfahrener Benutzer
 
Registriert seit: 08.11.2004
Beiträge: 2.079
Der_Gerhard ist zur Zeit noch ein unbeschriebenes Blatt
Der_Gerhard eine Nachricht über ICQ schicken
Standard

Zitat:
Zitat von nikosch77
Hab die Geschichte gerade auch in den User Notes gefunden
http://de3.php.net/manual/en/control...itch.php#59991

php wandelt wohl die case Werte in den Typ der in switch () angegeben Variable um.
Aua! So ein Mist!
Es wäre doch viel logischer, die Variable auf den Typ der Cases umzuwandeln.
Sonst kann man switch doch nie in Funktionen brauchen, wo nicht ganz sicher ist, welcher Typ übergeben wird.
(string) von 0 wäre '0' und es gäbe kein Problem.

Zitat:
Zitat von nikosch77
Und (int) von jeglichem String, der keine Ziffer beinhaltet ist dann 0.

Für alle Fauzlpelze, die Lösung für obiges Problem wäre dann:
PHP-Code:
<?php
switch($colname
  {
  case 
$colname === 'hua':
  case 
$colname === 'au':
  case 
$colname === 'ez':
    
// ... do something useful
  
}
?>
Das ergibt doch
PHP-Code:
<?
case false:
case 
false:
case 
false:
//...
?>
Wie wäre es mit
PHP-Code:
<?
switch (strval($colname))
?>
__________________
**********************************
Nein, ich bin nicht die Signatur.
Ich putze hier nur.
**********************************
Der_Gerhard ist offline  
Alt 19.07.2007, 23:23  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Es soll ja auch false ergeben. Dass der case durchlaufen wird, ist doch der Fehler. Und sorry, es muß natürlich
Code:
 case 'hu':
statt 'hua' heißen. Nicht, dass Zerglings komplizierte Methode plötzlich nicht mehr funktioniert...

EDIT:
zu früh gefreut. Das ist ja schon dreist:

PHP-Code:
<?

function switchtest ($test)
  {
  switch (
$test) {

    case 
$test === 'hua':
      echo 
'hua-he';
      break;

    case 
$test === '0':
      echo 
'0';
      break;

    case (string) 
$test === '1':
      echo 
'1';
      break;

    case 
$test === '2':
    case 
$test === 2:
      echo 
'2';
      break;

    default:
      echo 
'failed';
    }
  }

switchtest ('he');  // failed
switchtest ('hua'); // hua-he
switchtest (0);     // hua-he
switchtest ('0');   // hua-he
switchtest (1);     // 1
switchtest ('1');   // 1
switchtest (2);     // 2
switchtest ('2');   // 2

?>
nikosch ist gerade online  
Alt 19.07.2007, 23:42  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Ne also Vergleiche schreib ich in switch/case Blöcke nich noch rein. War aber auch ein Fehler, dass plötzlich ein Integer reingeschlüpft ist. Wenigstens hab ich ihn dann so gefunden und langsam dämmerts auch wieder, dass ich das Problem eigentlich schon kannte.
Danke euch!
Zergling-new ist offline  
Alt 20.07.2007, 00:02  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Ok, lesen hilft. Offenbar gehört in switch () ein true, wenn die cases mit Bedingungen erweitert werden. Das ist dann wirklich nur noch ein anders geschriebenes If-Statement.
Fürs obige Beispiel:
PHP-Code:
<?
function switchtest ($test)
  {
  switch (
true) {

    case (
$test === 'hua'):
      echo 
'hua-he';
      break;

    case (
$test === '0'):
      echo 
'0';
      break;

    case ((string) 
$test === '1'):
      echo 
'1';
      break;

    case (
$test === '2'):
    case (
$test === 2):
      echo 
'2';
      break;

    default:
      echo 
'failed';
    }
  }

switchtest ('he');  // failed
switchtest ('hua'); // hua-he
switchtest (0);     // failed
switchtest ('0');   // 0
switchtest (1);     // 1
switchtest ('1');   // 1
switchtest (2);     // 2
switchtest ('2');   // 2

?>
Alles richtig, aber Thema verfehlt. Setzen!
.
nikosch ist gerade online  
Alt 20.07.2007, 00:13  
Erfahrener Benutzer
 
Registriert seit: 08.11.2004
Beiträge: 2.079
Der_Gerhard ist zur Zeit noch ein unbeschriebenes Blatt
Der_Gerhard eine Nachricht über ICQ schicken
Standard

Zitat:
Zitat von nikosch77
Es soll ja auch false ergeben. Dass der case durchlaufen wird, ist doch der Fehler. Und sorry, es muß natürlich
Code:
 case 'hu':
statt 'hua' heißen. Nicht, dass Zerglings komplizierte Methode plötzlich nicht mehr funktioniert...
Neee. So wird das nix.

Wenn die Variable 0 enthält, wird ja jeder Case durchlaufen, weil 0 ja dem Wert im case (=false) entspricht.

EDIT:
Zwischendurch mal ein Refresh ist auch nicht schlecht...
Bin ja viiiiiel zu spät dran.
__________________
**********************************
Nein, ich bin nicht die Signatur.
Ich putze hier nur.
**********************************
Der_Gerhard ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 16:41 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.