Использование get_class в блоке try - catch

0

Вопросов

  • Можно ли создать экземпляр класса с get_class метода get_class в PHP?
  • Можно ли использовать get_class в блоке catch() чтобы поймать исключение из этого типа ошибки?

Моя собственная попытка

Всякий раз, когда используется get_class, он возвращает имя класса в виде строки. Когда я попытался создать его таким образом:

$classWhereExceptionObjectIsStored = new classWhereExceptionObjectIsStored();

try {
   //Some code

} catch(get_class($classWhereExceptionObjectIsStored->getExceptionObject $e)) {
   //Do stuff with the exception
}

Это не сработало.

Класс:

class classWhereExceptionObjectIsStored
{

    public function getExceptionObject($message) {
        return new LogicException($message); //For example
    }
}

Вторая попытка

$class = get_class($classWhereExceptionObjectIsStored->getExceptionInstance('hi!'));

try {
   //Some code

} catch($class $e)) {
   //Do stuff with the exception
}
Теги:
class
exception

1 ответ

1
Лучший ответ

get_class возвращает только имя класса, что использование этой функции. Вы можете создать экземпляр класса динамически, выполнив:

new $class();

Что в вашем случае, вероятно, должно привести к чему-то вроде:

new get_class($classWhereExceptionObjectIsStored->getExceptionInstance('hi!'));

Это не работает в блоке catch. Это потому, что вы не создаете экземпляр ничего в блоке catch - единственное, что вы указываете, - это класс исключений, который вы ожидаете получить.

Альтернативой было бы поймать все исключения:

catch(Exception $e){}

И затем в этом улове используйте функцию PHP is_a, чтобы проверить, было ли исключение броска того типа, которого вы ожидаете, например:

if(is_a($e, get_class($classWhereExceptionObjectIsStored->getExceptionInstance('hi!'))){}

Тем не менее, я действительно сомневаюсь в ваших мотивах. Я не могу придумать какой-либо вариант использования, когда это добавит функциональность, читаемость, масштабируемость или удобство использования.

  • 0
    Я просто искал некоторые функции и придумал эту идею :) Но как бы я использовал это в блоке catch() тогда? Потому что вы не называете там new оператора.
  • 0
    Я обновил свой ответ.
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню