是否可以用开关替换if( .. instanceof ...), elseif(... instanceof ...), ...
的块?
例如:
<?php
$class = ..... //some class
if($class instanceof SomeClass) {
//do something
} elseif($class instanceof SomeAnotherClass) {
//do something else
}
对于考虑继承的具有instanceof
的多态交换机:
switch(true) {
case $objectToTest instanceof TreeRequest:
echo "tree request";
break;
case $objectToTest instanceof GroundRequest:
echo "ground request";
break;
}
对于类名应该完全匹配的交换机:
$class = get_class($objectToTest);
switch($class) {
case 'TreeRequest':
echo "tree request";
break;
case 'GroundRequest':
echo "ground request";
break;
}
以下更正确:
$class = get_class($objectToTest);
switch($class) {
case TreeRequest::class:
echo "tree request";
break;
case GroundRequest::class:
echo "ground request";
break;
}
通过这种方式可以正确地比较名称空间(您不必键入它们),如果名称空间或类名等发生任何更改,您将收到一个相当不错的IDE错误,通知您的代码已损坏。
使用match
表达式,它看起来像这样:
return match(get_class($object)) {
TreeRequest::class => "tree request",
GroundRequest::class => "ground request",
default => "default request"
}
请记住,它错过了继承,只接受当前类。考虑继承的匹配表达式:
return match(true) {
$object instanceof TreeRequest=> "tree request",
$object instanceof GroundRequest => "ground request",
default => "default request"
}