web-dev-qa-db-ja.com

非静的メソッドPEAR :: isError()は静的に呼び出すべきではありません

RHEL 5xからCentOS 6xにアップグレードした後、httpdログに次のエラーが表示されるようになりました。

PHPの厳格な標準:非静的メソッドPEAR :: isError()は、33行目の/web/sites/blah/somescript.phpで静的に呼び出すべきではありません

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エラーに対処しているようですが、httpdログファイルにPEARエラーメッセージが表示されます。

システム情報:

_# 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()を呼び出す別の方法はありますか?

11
a coder

いいえ、ありません。 _PEAR::isError_は、PHP 4回のレガシーです。

_php.ini_のエラーレベルを変更するだけでは不十分な場合は、確認する必要があります

  • ロードされている別のphp.iniファイルがあるかどうか(Apacheを介してphpinfo()の出力を確認してください)
  • 一部のスクリプトはエラーレベルを設定します。

それでも解決しない場合は、実行時にerror_level()関数を使用して適切なレベルを設定するか、それ以外の方法で解決できない場合は、_@_演算子を使用してエラーを抑制します。 _@_は比較的 "遅い"(エラー報告はいずれにしても遅い...)ため、他のエラーを隠す可能性があるため、使用は避けてください。

長期的な提案としては、より近代的なライブラリを使用することです。

3
johannes

@johannesが間違っていると思います-これは非常に可能です。これをあなたのレシピで単に置き換えてください:

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

独自のコードを更新する場合、PEAR::isError($obj)を1つの引数で呼び出すことはis_a($obj, 'PEAR_Error')と同等であることは注目に値します。そのようなライブラリメソッドを「アンラップ」することはベストプラクティスではないことは知っていますが、基本的にはチェックの「インスタンス」にすぎません。

5