2012-01-16 3 views
1

나는 아약스를 통해서만 액세스 할 수있는 PHP 파일이 있습니다. 아약스 호출은 json_encoded 출력 형식의 데이터 만 필요합니다. 나는 PHP 에러를 잡아내는 커스텀 에러 핸들러 함수를 만들려고 노력하고 있는데, 대신 직접 출력하는 것이 아니라 json 파서를 위해 인코딩 된 배열에 전달한다.error_handler에서 변수에 액세스

은 지금까지 나는

// 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); 

내 문제는 JSON 객체에서 출력됩니다 있도록 $response 배열이 액세스 문서의 나머지 부분에 대한 범위를 벗어난 것입니다 있습니다. 참조로 변수를 사용자 지정 함수 또는 다른 방법으로 간과 할 수있는 방법이 있습니까? 당신은 OOP의 맥락에서 $ GLOBALS

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

답변

1

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

를 작동 또는 사용에

+0

그래서이 함수를 '실행'하기 위해서는'$ foo = new myClass(); $ foo-> outputAjax();'? 나는 PHP의 클래스에 관해서는 꽤 새로운 것이다. –

+0

너는 그것을 가지고있다. (그리고 $ globals은 악하다) –

+0

고마워, 나는 그들의 존재를 다시는 알지 못할 것이다. :) –

1

는 속성으로 $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); 
    } 

} 
+0

물론. 나는 "세계를 사용하지 마라"라는 만트라를 내게 들려 주어 너무나 힘들어서 그곳에 시간과 장소가 있다는 것을 잊어 버렸다. –

+0

전역을 사용하지 마십시오. 그들은 실제로 어떤 것에 대한 해답이 아닙니다. 최소한 클래스의 공용 정적 속성 또는 인스턴스화 된 개체를 사용하고 전역 적이 아닌 속성을 사용하십시오. 'Blah :: $ php_errors [] = ...'와 같은 것은 더 깨끗합니다. – Kenaniah