2016-06-17 14 views
0

Ich lerne PHP. Ich habe ein Open-Source-Projekt von einer Website heruntergeladen und den Workflow der einzelnen Module in diesem Projekt untersucht. Ich habe einen Schalterfall bemerkt, der mir unbekannt ist.Switch Case-Anweisung in PHP

switch ($value) { 
     case 'student': 
     case StudentClass::getInstance()->getId(); 
      return new StudentClass(); 
      break; 
     case 'teacher': 
     case TeacherClass::getInstance()->getId(); 
      return new TeacherClass(); 
      break; 
     default: 
      break; 
    } 

Der obige Patch ist, was ich sah. Wenn ich Eingang geben:

$value = 'student'; 

Es gibt StudentClass Instanz.

Wenn ich geben

$value = 'teacher'; 

dann gibt es TeacherClass Instanz.

Wenn jemand den Fluss erklärt, wird es mir hilfreich sein, um zu verstehen, PHP viel besser

+0

Nevermind, was ist das Problem? Es macht, was es tun soll. – Andreas

+0

Nein. Ich habe keine Aussagen vermisst. Das habe ich in diesem Modul gesehen. –

+0

Jedes 'case' xx ': 'ist das gleiche wie wenn Sie ein' if ($ value == "xx") {} 'wo' break; 'ist das Ende} – Andreas

Antwort

5

Ihre Zeichenfolge cases nicht break oder return Aussagen nicht installiert haben, so dass sie „fallen durch“ zum nächsten case. Auch Ihre break s dienen hier keinem Zweck.

Ich habe Ihrem Code Kommentare hinzugefügt, um zu erklären, was passiert.

switch ($value) { 
     case 'student': // keeps going with next line 
     case StudentClass::getInstance()->getId(); 
      return new StudentClass(); // handles both cases above 
      break; // unnecessary because of the return above 
     case 'teacher': // keeps going with next line 
     case TeacherClass::getInstance()->getId(); 
      return new TeacherClass(); // handles both cases above 
      break; // unnecessary because of the return above 
     default: 
      break; // pointless, but handles anything not already handled 
} 

Auch PHP erlaubt explizit die Verwendung von einem Semikolon (;) nach einem case, aber es ist im Allgemeinen nicht gut Stil betrachtet. From the docs:

Es ist möglich, ein Semikolon statt eines Doppelpunkt nach einem Fall zu verwenden ... ist

+1

ein Semikolon anstelle eines Doppelpunkts zu verwenden. Als Syntax sollte case-Anweisung mit Doppelpunkt enden. Aber hier sehe ich Fall mit Semikolon. Bitte klären Sie meine Zweifel. –

+0

@JayVenkat siehe meine Bearbeitung. Dies ist erlaubt, aber es ist ungewöhnlich. –

0

Switch-Anweisung verwendet, um verschiedene Aktionen auf der Grundlage verschiedener Bedingungen.

Zuerst haben wir einen einzelnen Ausdruck n (meistens eine Variable), der einmal ausgewertet wird. Der Wert des Ausdrucks wird dann mit den Werten für jeden Fall in der Struktur verglichen. Wenn eine Übereinstimmung vorliegt, wird der diesem Fall zugeordnete Codeblock ausgeführt. Verwenden Sie break, um zu verhindern, dass der Code automatisch in den nächsten Fall eintritt. Die Standardanweisung wird verwendet, wenn keine Übereinstimmung gefunden wird.

switch (n) { 
 
    case label1: 
 
     code to be executed if n=label1; 
 
     break; // if n=label1,break ends execution and exit from switch 
 
    case label2: 
 
     code to be executed if n=label2; 
 
     break; // if n=label2,break ends execution and exit from switch 
 
    case label3: 
 
     code to be executed if n=label3; 
 
     break; // if n=label3,break ends execution and exit from switch 
 
    ... 
 
    default: 
 
     code to be executed if n is different from all labels; 
 
}