2016-05-04 33 views
13

if(.. instanceof ...), elseif(... instanceof ...), ...のブロックをスイッチに置き換えることはできますか?例えばPHPのクラス(instanceof)で切り替える

<?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

その2番目は素晴らしいトリックです。 –

+0

switch(true)、:+1: –

+10

最初の例を見ている人は、クラスの継承と実装を無視するので、 'instanceof'と同じではありません。 – SEoF

関連する問題