Переключение по классу (instanceof) в переполнении стека

Можно заменить блок if( .. instanceof ...), elseif(... instanceof ...), ... с выключателем?

Например:

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

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

18

Решение

Следующее является более правильным:

$class = get_class($objectToTest);

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

Таким образом, пространства имен сравниваются должным образом (вам не нужно их печатать), и если что-то изменится, например, пространство имен или имя класса, вы получите приличную ошибку IDE, сообщающую, что ваш код не работает.

11

Другие решения

Некоторым нравится это:

$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;
}
50

По вопросам рекламы [email protected]