2013-10-08 4 views
10

После обновления RHEL ого до CentOS ого, я начал видеть эти ошибки в моем журнале HTTPd:Non-статический метод PEAR :: IsError() не должен вызываться статический

Строгих стандартах 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 к error reporting. Перезагрузите httpd, чтобы загрузить новую конфигурацию. Все еще получаются сообщения об ошибках.

Другие упомянули ту же проблему с MDB2, поэтому я обновил эти пакеты до beta releases. Казалось, что это касается ошибок 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(), что не будет производить ошибки?

ответ

3

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

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

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

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

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

+0

Я подтвердил, что /etc/php.ini - это то, что используется (и редактируется). Я дважды проверю скрипты, чтобы убедиться, что что-то не переопределяет php.ini –

+4

Существует ли современная альтернатива PEAR :: isError? –

+2

Можно ли назвать это нестатически?'$ pear = new PEAR(); $ pear-> isError ($ something); ' –

14

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

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

Это, однако, требует редактирования всех библиотек, которые используют «традиционный» способ. Так что да, это можно сделать в собственном коде, но у меня все еще возникают проблемы. Лучше использовать современные библиотеки. – johannes

+2

@johannes Верьте или нет, некоторые современные библиотеки делают эту основную архитектурную ошибку - библиотеку аутентификации PHP Yubico, в частности. И иногда глобальная находка и замена бьют охоту за новым решением. –

+0

Или переключение на PDO, что я и сделал. –

5

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

Смежные вопросы