Gibt es sowieso eine Möglichkeit, damit der folgende Code noch einen Schalter verwendet und b
nicht zurückgibt a
? Vielen Dank!
$var = 0;
switch($var) {
case NULL : return 'a'; break;
default : return 'b'; break;
}
Wenn Sie if-Anweisungen verwenden, würden Sie dies natürlich folgendermaßen tun:
$var = 0;
if($var === NULL) return 'a';
else return 'b';
Bei komplexeren Beispielen wird dies jedoch ausführlich.
php
type-conversion
Aaron Yodaiken
quelle
quelle
Hier ist Ihr Originalcode in einer "strengen" switch-Anweisung:
switch(true) { case $var === null: return 'a'; default: return 'b'; }
Dies kann auch komplexere switch-Anweisungen wie diese verarbeiten:
switch(true) { case $var === null: return 'a'; case $var === 4: case $var === 'foobar': return 'b'; default: return 'c'; }
quelle
Nicht mit
switch
- es werden nur sogenannte "lose" Vergleiche durchgeführt. Sie können es jederzeit durch einenif/else if
Block ersetzen , indem Sie===
.quelle
switch
(siehe meine Antwort), obwohl ich denke, dassif-else
dies für diesen bestimmten Job besser ist.break
oder habenreturn
?Vermutlich schalten Sie die Variable ein und erwarten ganze Zahlen. Warum nicht einfach vorher den Integer-Status der Variablen überprüfen
is_int($val)
?quelle
Ich hatte das gleiche Problem in einem Schalter mit Zeichenfolge, die Zahlen enthält ("15.2" ist gleich "15.20" in einem Schalter für PHP)
Ich habe das Problem gelöst, indem ich vor dem zu vergleichenden Text einen Buchstaben hinzugefügt habe
$var = '15.20'; switch ('#'.$var) { case '#15.2' : echo 'wrong'; break; case '#15.20' : echo 'right'; break; }
quelle
switch
Verwendet leider einen losen Vergleich und soweit ich weiß gibt es keine Möglichkeit das zu ändern.quelle
Die switch-Anweisung in PHP führt nur lose Vergleiche durch (==), siehe http://www.php.net/manual/en/control-structures.switch.php
Verwenden Sie if / elseif / else, wenn Sie strenge Vergleiche benötigen.
quelle
Ich benutze nur
$var === null and $var = -1; // since switch is not type-safe switch ( $var ) { case 0: # this tests for zero/empty string/false break; case -1: # this tests for null break; }
Ich denke, das sieht immer noch sehr gut lesbar aus, wenn der Kommentar, der mit beginnt, zurückgelassen
//
wird (und diejenigen, die mit beginnen,#
werden wahrscheinlich am besten gelöscht).quelle
Nee. Von der Handbuchseite :
Wenn Sie nur zwei Bedingungen haben, verwenden Sie eine
if
wie Ihr zweites Beispiel. Andernfalls prüfen SieNULL
zuerst und schalten Sie die anderen Möglichkeiten ein:if (is_null($var)) { return 'a'; } switch ($var) { // ... }
quelle
Wenn Sie Ihren Beispielcode extrapolieren, haben Sie wahrscheinlich eine Reihe von regulären Fällen und einen Sonderfall (hier
null
).Das Einfachste, was ich herausfinden kann, ist, diesen Fall vor dem Wechsel zu behandeln:
if ($value === null) { return 'null'; } switch ($value) { case 0: return 'zero'; case 1: return 'one'; case 2: return 'two'; }
Fügen Sie möglicherweise auch einen Kommentar hinzu, an den Sie sich erinnern sollten,
null
dass er unerwartet zum0
Fall passt (auch im Gegenteil,0
würde zu einemnull
Fall passen ).quelle
Ja. Unter PHP 8 können Sie dies mit
match
Anweisung tun .Siehe hier: https://www.php.net/manual/en/control-structures.match.php
$var=0; echo match ($var) { NULL=> 'a', default => 'b' };
quelle
Das ist nicht möglich.
Sie können jedoch setzen die
if
Aussagen innerhalb derswitch
:switch($var) { // Loose cases here case 0: if($var === NULL) { return 'a'; } // Fall through default: return 'b'; }
Oder einfach:
switch($var) { // Loose cases here default: if($var === NULL) { return 'a'; } return 'b'; }
quelle
switch
, der manchmal über eine strenge Überprüfung hinausgeht.Sie können auch den Typ der Variablen einschalten:
switch (gettype($var)) { ... }
quelle
Never use gettype() to test for a certain type, since the returned string may be subject to change in a future version. In addition, it is slow too, as it involves string comparison. Instead, use the is_* functions.
Eine der besten Möglichkeiten besteht darin, den NULL-Wert mithilfe von zu überprüfen
is_null
<?php echo getValue(); function getValue() { $var = 0; switch(true) { case is_null($var) : return 'a'; break; default : return 'b'; break; } } ?>
quelle
=== null
unnötiger Funktionsaufruf-Overhead vermieden wird.Erstellen Sie eine Assertions-ähnliche Klasse und fügen Sie die gewünschte Logik ein. solange "wahre" Methoden zurückkehren
$this
(und nichts anderes, um Fehlalarme zu vermeiden).class Haystack { public $value; public function __construct($value) { $this->value = $value; } public function isExactly($n) { if ($n === $this->value) return $this; } } $var = new Haystack(null); switch ($var) { case $var->isExactly(''): echo "the value is an empty string"; break; case $var->isExactly(null): echo "the value is null"; break; }
Oder Sie können Ihren Schalter in die eigentliche Klasse stellen:
class Checker { public $value; public function __construct($value) { $this->value = $value; } public function isExactly($n) { if ($n === $this->value) return $this; } public function contains($n) { if (strpos($this->value, $n) !== false) return $this; } public static function check($str) { $var = new self($str); switch ($var) { case $var->isExactly(''): return "'$str' is an empty string"; case $var->isExactly(null): return "the value is null"; case $var->contains('hello'): return "'$str' contains hello"; default: return "'$str' did not meet any of your requirements."; } } } var_dump(Checker::check('hello world')); # string(28) "'hello world' contains hello"
Natürlich möchten Sie an diesem Punkt möglicherweise neu bewerten, was Sie mit dem, was Sie überprüfen, tun möchten, und stattdessen eine echte Validierungsbibliothek verwenden.
quelle
Wenn Sie sowohl den Wert als auch den Typ Ihrer Variablen testen möchten , erstellen Sie eine neue Zeichenfolgenvariable, die beide Informationen enthält, und vergleichen Sie sie mit Ihren verschiedenen Szenarien (durch Verkettung). Dies sollte für Ihren Fall funktionieren, wenn Sie alle möglichen Typen implementieren (gemäß gettype ( ) Dokumentation ), Beispiel:
<?php $var= 9999; $valueAndTypeOfVar = (string)$var.' '.gettype($var); switch($valueAndTypeOfVar) { case "$var boolean" : echo 'a'; break; case "$var integer" : echo 'b'; break; case "$var double" : echo 'c'; break; case "$var string" : echo 'd'; break; case "$var array" : echo 'e'; break; case "$var object" : echo 'f'; break; case "$var resource" : echo 'g'; break; case "$var NULL" : echo 'h'; break; case "$var unknown type" : echo 'i'; break; default: echo 'j'; break; } // Outputs: 'b' ?>
quelle