Почему устаревшие функции php (в отличие от устаревших) не вызывают функцию error_handler? - PullRequest
0 голосов
/ 13 сентября 2011

Я обновляю кодовую базу с php 5.2 до 5.3. В рамках этого я преобразую использование устаревших функций и возможностей. Когда мы используем устаревшие функции, такие как split и spliti, вызывается обработчик ошибок, который мы настраиваем, вызывая set_error_handler(), и я получаю сообщение журнала. Это здорово.

Но, когда я использую следующие две устаревшие функции:

  1. Назначение возвращаемого значения new по ссылке теперь устарело.
  2. Передача по ссылке во время разговора устарела.

Обработчик ошибок не вызывается, поэтому я не вижу сообщения журнала. Если я звоню error_get_last(), я вижу, что ошибка регистрируется, и я также вижу ее в журнале ошибок php, но мы используем обработчик ошибок, чтобы перехватить все это. Я обеспокоен тем, что что-то в настройках моего сервера вызывает что-то, что работает неправильно.

Вы можете просмотреть устаревшие функции / функции здесь: http://www.php.net/manual/en/migration53.deprecated.php

1 Ответ

0 голосов
/ 17 декабря 2012

Вы также можете отслеживать устаревшие сообщения об ошибках с помощью set_error_handler(). Проблема, которую вы описываете, заключается в том, что эти сообщения об исключении выдаются до того, как вы зарегистрируете свою функцию обработки ошибок.

Два сообщения, которые вы называете, выдаются во время анализа. Это означает, что если вы зарегистрируете свою функцию обработчика ошибок слишком поздно, вы больше не сможете их обрабатывать (потому что они прошли).

Поэтому решение тривиально: зарегистрируйте ваш обработчик ошибок до этих файлов. Рабочий пример:

Файл error-handler-deprecated-include.php:

<?php

# 1. Assigning the return value of new by reference is now deprecated.
$var = &new stdClass();

# 2. Call-time pass-by-reference is now deprecated
trim(&$var);

Файл error-handler-deprecated.php:

<?php

$handler = function($errno, $errstr, $errfile, $errline) {
    echo "Error: ", var_dump($errno, $errstr, $errfile, $errline), 
         "-----------------------------------\n";
};

echo 'set_error_handler() [previous handler]: ', 
      var_dump(set_error_handler($handler));

# test 1. and 2. by including the code *after* the error handler has been set
include('error-handler-deprecated-include.php');

Запуск php error-handler-deprecated.php в PHP 5.3 затем приводит к следующему выводу, поскольку вы можете видеть, что обработчик ошибок обрабатывает все эти устаревшие сообщения рядом с другими ошибками:

set_error_handler() [previous handler]: NULL
Error: int(8192)
string(60) "Assigning the return value of new by reference is deprecated"
string(98) "error-handler-deprecated-include.php"
int(7)
-----------------------------------
Error: int(8192)
string(47) "Call-time pass-by-reference has been deprecated"
string(98) "error-handler-deprecated-include.php"
int(10)
-----------------------------------
Error: int(2)
string(53) "trim() expects parameter 1 to be string, object given"
string(98) "error-handler-deprecated-include.php"
int(10)
-----------------------------------
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...