不应静态调用非静态方法PEAR :: isError()

时间:2013-10-08 13:04:38

标签: php static pear

从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添加到error reporting。重新启动httpd以加载新配置。仍然收到这些错误消息。

其他人提到了与MDB2相同的问题,因此我将这些包更新为beta releases。这似乎解决了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()不会产生错误?

3 个答案:

答案 0 :(得分:14)

我害怕@johannes不正确 - 这是非常可行的。只需在您的食谱中替换它:

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

答案 1 :(得分:5)

值得注意的是,如果您要更新自己的代码,则使用一个参数调用PEAR::isError($obj)等同于is_a($obj, 'PEAR_Error')。我知道这样的“解包”库方法不是最好的做法,但它基本上只是一个“检查实例”。

答案 2 :(得分:3)

不,没有。 PEAR::isError是PHP遗留的4倍。

如果更改php.ini中的错误级别是不够的,您应该检查

  • 是否正在加载另一个php.ini文件(通过Apache检查phpinfo()输出)
  • 某些脚本设置错误级别。

如果所有这些都没有帮助,请在运行时使用error_level()函数设置适当的级别,或者如果没有其他帮助,请使用@运算符来抑制错误。应该避免使用@因为它相对“慢”(错误报告总是很慢......)并且它可能隐藏其他错误。

长期建议是使用更多现代化的图书馆。