Переменная доступа из error_handler - PullRequest
1 голос
/ 17 января 2012

У меня есть php-файл, доступ к которому осуществляется только через ajax. Вызов ajax ожидает только данные, отформатированные как вывод json_encode d. Я пытаюсь создать пользовательскую функцию-обработчик ошибок, которая перехватывает php-ошибки и вместо того, чтобы выводить их напрямую, вместо этого передает их в массив, который они закодированы для анализатора json.

Пока у меня есть

// error handler function
function handleErrors($errno, $errstr, $errfile, $errline)
{
    if (!(error_reporting() & $errno)) {
        // This error code is not included in error_reporting
        return;
    }

    $response['php_error'][] = "Error [$errno] - $errstr on line $errline in file $errfile";

    /* Don't execute PHP internal error handler */
    return true;
}

set_error_handler("handleErrors");

//do other stuff that might trigger php errors

if ($result===true){
    $response['success'] = true;
}else{
    $response['success'] = false;
    $response['error'] = $result;
    $response['request'] = json_encode($_REQUEST);
}

echo json_encode($response);

Моя проблема в том, что массив $response находится вне области видимости для доступа к остальной части документа, поэтому он будет выводиться в объекте json. Есть ли способ передачи переменной по ссылке в пользовательскую функцию или другой способ, который я пропустил?

Ответы [ 2 ]

1 голос
/ 17 января 2012

В контексте ООП вы можете определить $response как свойство.

class myclass {

    var $response;

    function __construct()
    {
        set_error_handler(array($this, 'handleErrors'));
    }

    function handleErrors($errno, $errstr, $errfile, $errline)
    {
        if ( ! (error_reporting() & $errno))
        {
            // This error code is not included in error_reporting
            return;
        }

        $this->response['php_error'][] = "Error [$errno] - $errstr on line $errline in file $errfile";

        /* Don't execute PHP internal error handler */
        return true;
    }

    function outputAjax()
    {
        // my code

        if ($result === true)
        {
            $this->response['success'] = true;
        } else
        {
            $this->response['success'] = false;
            $this->response['error'] = $result;
            $this->response['request'] = json_encode($_REQUEST);
        }

        echo json_encode($this->response);
    }

}
1 голос
/ 17 января 2012

Определите $ response как глобальную в вашей функции

function handleErrors($errno, $errstr, $errfile, $errline)
{
    global $response;
    //further code..
}

ИЛИ используйте $ GLOBALS

$GLOBALS['response']['php_error'][] = "Error [$errno] - $errstr on line $errline in file $errfile";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...