Нестатический метод PEAR:: isError() не следует называть статически

После обновления с RHEL 5x до CentOS 6x я начал видеть эти ошибки в моем журнале httpd:

Строгие стандарты PHP: нестатический метод PEAR:: isError() не должен быть называется статически в /web/sites/blah/somescript.php в строке 33

Я видел похожие ошибки для MDB2. Подробнее об этом за секунду.

somescript.php:

32  $mdb2_dbx = MDB2::factory($dsn_mdb2, $mdb2_options);
33  if (PEAR::isError($mdb2_dbx))
34  {
35      $err = '<p>Cannot connect to database: ' . $mdb2_dbx->getMessage();
36      errorHandler($err);
37  }   

Первое, что я сделал, это отредактировать /etc/php.ini и добавить & ~E_STRICT в отчет об ошибках. Перезагрузите httpd, чтобы загрузить новую конфигурацию. Все эти сообщения об ошибках.

Другие упомянули ту же проблему с MDB2, поэтому я обновил эти пакеты до бета-релизов . Это, по-видимому, касается ошибок MDB2, но я все еще получаю сообщения об ошибках PEAR в файле журнала httpd.

Информация о системе:

# pear list
PEAR               1.9.4   stable
MDB2               2.5.0b5 beta
MDB2_Driver_mysql  1.5.0b4 beta
MDB2_Driver_mysqli 1.5.0b4 beta

# php --version
PHP 5.4.20 (cli) (built: Sep 18 2013 19:55:33) 

# cat /etc/centos-release 
CentOS release 6.4 (Final)

# apachectl -v
Server version: Apache/2.2.15 (Unix)

Вопрос

Есть ли другой способ вызова PEAR::isError(), который не приведет к ошибкам?

Ответ 1

Нет, нет. PEAR::isError является устаревшим с PHP 4 раза.

Если изменить уровень ошибки в php.ini недостаточно, вы должны проверить

  • Будет ли загружен другой загружаемый файл php.ini(проверьте выход phpinfo() через Apache)
  • некоторые script устанавливают уровень ошибок.

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

Долгосрочное предложение было бы использовать более современные библиотеки.

Ответ 2

Я боюсь, что @johannes неверен - это очень выполнимо. Просто замените это в своем рецепте:

if ((new PEAR)->isError($mdb2_dbx)) {
    // Victory! Er, I mean, Error!
    ...
}

Ответ 3

Возможно, стоит отметить, что вызов PEAR::isError($obj) с одним аргументом эквивалентен is_a($obj, 'PEAR_Error'), если вы обновляете свой собственный код. Я знаю, что не рекомендуется "разворачивать" подобный библиотечный метод, но в основном это просто "экземпляр" проверки.