PHP: классы пространства имен, загрузка классов и исключения вызывают странное поведение - PullRequest
1 голос
/ 12 июля 2011

Я наблюдал странное поведение, связанное с обработкой исключений в PHP в недавнем проекте.Кейс выглядит следующим образом.

В моем приложении я использую пространства имен.Все классы находятся в отдельных файлах исходного кода.Код, относящийся к этому конкретному случаю, распределен по 3 классам.

«Внешний» класс - это диспетчер (или маршрутизатор), который заключает диспетчерский вызов в блок try-catch.Отправленный запрос вызывает метод из третьего класса, который запускает код (заключенный в блок try-catch), который вызывает исключение.

Поскольку я пропустил оператор use Exception; в классе, гдепроисходит ошибка, сгенерированное исключение просачивается обратно к самому внешнему слою (диспетчеру), где оно перехватывается - заставляя меня почесать голову, почему перехват кода, вызывающего ошибку, не работает.

Мне это кажется странным.По логике вещей, PHP должен в этой ситуации (IMO) выдавать Class not found исключение / ошибку, приводя меня к реальной ошибке в моем коде, вместо того, чтобы пытаться "остаться в живых" как можно дольше.

Должно ли это быть зарегистрировано как ошибка, или это ожидаемое поведение?

Редактировать: Пример кода

Файл: class-a.php

<?php 
namespace hello\world;

class classA {
    protected $b;

    public function __construct() {
        $this->b = new \hello\world\classB();
    }

    public function doSomething() {
        try {
            $this->b->throwException();
        } catch (Exception $e) {

        }
    }
}

Файл: class-b.php

<?php 
namespace hello\world;

class classB
{
    public function throwException() {
        throw new \Exception("bar closed");
    }
}

Файл: run.php

<?php 
include 'class-a.php';
include 'class-b.php';

$a = new \hello\world\classA();

$a->doSomething();

ClassB throw s \Exception in ClassB::doSomething(), для которого ClassA имеет catch -clause, но поскольку ClassA не объявляет use Exception или catch (\Exception), catch не совпадает и выполнение заканчивается с Uncaught exception ошибкой 1 .Но, на мой взгляд, это должно вызвать ошибку Class not found.

Возможно, я ожидаю слишком многого от разрешающего компилятора PHP, но это поможет отследить глупые ошибки, которые компилятору будет легко обнаружить.

1 Если бы $a->doSomething() в run.php был окружен предложением try..catch, Exception был бы (или, по крайней мере, мог бы) быть там пойман, так как он стекался по стеку.

1 Ответ

3 голосов
/ 12 июля 2011

Механизм перехвата исключений в PHP не проверяет, существует ли класс, который вы перехватываете.

Он демонстрирует то же поведение при использовании шрифтов в функциях, поэтому я подозреваю, что он просто преобразует подсказку типа исключения / функции в строку или что-то в этом роде и сравнивает это с типом соответствующего объекта.

Является ли это ошибкой или нет, сомнительно. Лично я думаю, что это должно быть классифицировано как ошибка, но PHP имеет все возможные варианты поведения: D

...