2016-05-04 15 views
13

Es ist möglich, Block von if(.. instanceof ...), elseif(... instanceof ...), ... mit Schalter zu ersetzen?Switch by Klasse (instanceof) in PHP

Zum Beispiel:

<?php 
$class = ..... //some class 

if($class instanceof SomeClass) { 
    //do something 
} elseif($class instanceof SomeAnotherClass) { 
    //do something else 
} 

Antwort

4

Hier finden Sie mehr korrekt:

$class = get_class($objectToTest); 

switch($class) { 
    case TreeRequest::class: 
     echo "tree request"; 
     break; 
    case GroundRequest::class: 
     echo "ground request"; 
     break; 
} 

Auf diese Weise werden Namespaces richtig verglichen (Sie müssen sie nicht eingeben). Wenn sich etwas ändert, wie der Namespace oder Klassenname, erhalten Sie einen anständigen IDE-Fehler, der Sie darüber informiert, dass Ihr Code defekt ist.

+0

Denken Sie daran, dass auf diese Weise Sie vermissen Unterklassen (Klassenvererbung und -implementierungen) –

38

Einige wie folgt aus:

$class = get_class($objectToTest); 

switch($class) { 
    case 'TreeRequest': 
     echo "tree request"; 
     break; 
    case 'GroundRequest': 
     echo "ground request"; 
     break; 
} 

Oder diese:

switch(true) { 
    case $objectToTest instanceof TreeRequest: 
     echo "tree request"; 
     break; 
    case $objectToTest instanceof GroundRequest: 
     echo "ground request"; 
     break; 
} 
+3

Das zweite ist ein netter Trick. –

+0

that switch (true),: +1: –

+10

Eine Warnung an alle, die das erste Beispiel verwenden: es ist nicht dasselbe wie instanceof, da Klassenvererbung und Implementierungen ignoriert werden. – SEoF