在PHP

2016-05-04 34 views
13

中按类(instanceof)切换可以用开关替换if(.. instanceof ...), elseif(... instanceof ...), ...块吗?在PHP

例如:

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

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

回答

4

下面是更正确的:

$class = get_class($objectToTest); 

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

通过这种方式正确比较命名空间(您不必输入它们),并且如果命名空间或类名称等任何更改都会发生体面的IDE错误,从而通知您代码已损坏。

+0

请记住,这样你错过了子类(类的继承和实现) –

38

一些这样的:

$class = get_class($objectToTest); 

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

或者这样:

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

第二个是一个不错的窍门。 –

+0

switch(true),:+1: –

+10

对使用​​第一个例子的任何人的警告:它与'instanceof'不同,因为它忽略了类的继承和实现。 – SEoF