2016-05-04 14 views
13

È possibile sostituire il blocco di if(.. instanceof ...), elseif(... instanceof ...), ... con l'interruttore?Passare per classe (instanceof) in PHP

Ad esempio:

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

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

risposta

4

Quello che segue è più corretto:

$class = get_class($objectToTest); 

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

In questo modo gli spazi dei nomi vengono confrontati correttamente (non è necessario digitarli) e se qualcosa cambia come lo spazio dei nomi o il nome della classe si otterrà un errore IDE decente che informa che il codice è rotto.

+0

ricorda che in questo modo ti mancano sottoclassi (eredità di classe e implementazioni) –

38

Alcuni, come questo:

$class = get_class($objectToTest); 

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

O questo:

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

Questo secondo è un bel trucco. –

+0

che cambia (true),: +1: –

+10

Un avvertimento per chiunque stia utilizzando il primo esempio: non è lo stesso di 'instanceof' in quanto ignora l'ereditarietà e le implementazioni della classe. – SEoF