2016-05-05 2 views
0

я получаю эту ошибку:set_error_handler() получает неверный обратный вызов?

set_error_handler() expects the argument (userErrorAdvice) to be a valid callback


trait userErrorAdviceTrait 
{ 
    public function userErrorAdvice() 
    { 
     $error = error_get_last(); 
     $_SESSION['errorStore'] = $error; 
     $errorMessage = "No file exists for the PageController"; 
     if (strstr($error['message'], "No file exists for the PageController class")) 
     { 
      header('Location: http://192.171.127.39/~louis/errorAdvicePage.php?errorType=NoPageControllerError'); 
      exit; 
     } 
    } 
    public function setUserErrorAdvice() 
    { 
     set_error_handler("userErrorAdvice"); 
    } 
} 

use userErrorAdviceTrait; 
public static function makePageController($pageName) 
{ 
    //self::shutDownFunction(); 
    //self::shutdown_function(); 
    self::setUserErrorAdvice(); 

    //Rest of code .... 

Это заставляет меня писать больше деталей, но я ничего не осталось сказать.

+0

Не уверен в этом на 100%, но я предполагаю, что это проблема с областью. 'set_error_handler' предназначен не только для определенного класса, но и для всего вашего скрипта, поэтому он ищет глобальную функцию' userErrorAdvice() '. Так как он не обнаружил, что он выбрасывает эту ошибку. – Mike

+0

'http://192.171.127./~louis [etc]' не похоже на действительный URL. – Mike

+0

nvm url, это просто ошибка в том, как я набрал его на stackoveflow. Будет корректироваться. –

ответ

1

Я сделал простой рабочий тест для этого. Вот код, который я собираюсь рассмотреть

<?php 

trait userErrorAdviceTrait 
{ 
    public function function userErrorAdvice($errno, $errstr) 
    { 
     echo 'error no '.$errno.' and message '.$errstr.PHP_EOL; 
    } 

    public function setUserErrorAdvice() 
    { 
     set_error_handler("userErrorAdvice"); 
    } 
} 

class TestErrorFunction 
{ 
    use userErrorAdviceTrait; 

    public static function makePageController($pageName) 
    { 
     self::setUserErrorAdvice(); 
    } 
} 

TestErrorFunction::makePageController('page'); 

Здесь я вижу некоторые проблемы. Позвольте мне объяснить и исправить их.

  1. Вы используете нестатические функции как статические. Когда должен выполняться метод (функция) userErrorAdvice(), он должен «иметь» и объект. Но объект не создается для этой функции.

  2. Аргумент для функции set_error_handler() должен быть PHP callable. В нашем случае нет глобальной функции userErrorAdvice().

Существует несколько возможных вариантов устранения проблем. Например,

<?php 

trait userErrorAdviceTrait 
{ 
    public static function userErrorAdvice($errno, $errstr) 
    { 
     echo 'error no '.$errno.' and message '.$errstr.PHP_EOL; 
    } 

    public static function setUserErrorAdvice() 
    { 
     set_error_handler([userErrorAdviceTrait::class, "userErrorAdvice"]); 
     // the other option here 
     // set_error_handler('userErrorAdviceTrait::userErrorAdvice'); 
    } 
} 

class TestErrorFunction 
{ 
    use userErrorAdviceTrait; 

    public static function makePageController($pageName) 
    { 
     self::setUserErrorAdvice(); 
     include 'no existing file'; 
    } 
} 

TestErrorFunction::makePageController('page'); 

Этот код выдал следующий результат.

$ php code.php 
error no 2 and message include(no existing file): failed to open stream: No such file or directory 
error no 2 and message include(): Failed opening 'no existing file' for inclusion (include_path='.:/usr/share/php') 

Еще раз то, что я сделал

  1. Fixed вызываемого параметра.
  2. Определенные методы как статические причины используются в статическом контексте.