Vse o WEB
Информация и размышления о Web технологиях

Сюрприз от разработчиков PHP

Сегодня мы поговорим об одном сюрпризе от разработчиков PHP, который меня немного улыбнул. Верней мне-то  это особого неудобства не доставило, а вот коллеги, которые хендлят разные дебаги и фатальные ошибки были, мягко говоря, недовольны большим количеством спама на их почте. В чем же причина?

Все, кто работал с SOAP сервисами в PHP, знают, что в этом нет ничего сложного, благодаря наличию SOAP-расширения ( доступно в стандартной сборке PHP 5.х). Процесс обращения к сервису происходит примерно так:

$wsdl = ‘http://test.service.com/?wsdl’; 
$options = array(‘trace’ => 1, ‘exceptions’ => true); 

try { 
    $client = new SoapClient($wsdl’, $options); 
    $users = $client->getUsers(); 
} catch (SoapFault $e) {
    echo $e->faultmessage; 
}

Давайте рассмотрим опции, переданные клиенту:

- trace включает отслеживание запроса и в случае ошибки можно получить обратную трассировку. По умолчанию имеет значение FALSE.

- exceptions принимает булевые значения и определяет будут ли SOAP-ошибки бросать исключения типа SoapFault.

Полный список опций можно посмотреть здесь.

Включив опцию exceptions мы ожидаем, что все возможные ошибки будут возникать в виде исключений. Но если вдруг окажется, что недоступен файл WSDL, кроме исключения SoapFault возникнет фатальная ошибка - а вот и сюрприз! Да не простая ошибка … она каким-то чудным образом не прекращает выполнение скрипта. Но если не устанавливать опции exceptions в TRUE, то фатальная ошибка сработает как надо. Для многих это покажется не существенным, поскольку можно легко подавить их с помощью оператора @ или отключить отображение ошибок для конечного пользователя. Однако в случае использования дебаггеров, которые отлавливают фатальные ошибки с помощью функции error_get_last(), подобные фаталы очень даже отлавливаются, хотя и не несут вреда в практическом смысле.

Начал я искать решения данного момента и наткнулся на следующее. Оказывается, что эта ошибка существует с версии 5.2 и в версии 5.4 она до сих пор не исправлена. Разработчики посчитали, что это не баг :) А нам остается только мириться с неудобствами и использовать так сказать “as is” ...

Наверх