【问题标题】:php: set_error_handler causes Non-static method Mail::factory() should not be called staticallyphp: set_error_handler 导致非静态方法 Mail::factory() 不应被静态调用
【发布时间】:2019-01-08 13:10:11
【问题描述】:

我有以下邮件发送功能:

function SendMailUtf8($to, $subject, $message) {
    require_once "Mail.php";

    $from = "mydomain <myuser@mydomain.com>";

    $host = "mydomain.com";
    $username = "myuser";
    $password = "mypassword";

    $headers = array ('From' => $from, 'To' => $to, 'Content-Type' => 'text/html; charset=UTF-8', 'X-Mailer' => 'PHP/'.phpversion(), 'Reply-To' => 'myuser@mydomain.com', 'Subject' => '=?UTF-8?B?'.base64_encode($subject).'?=');
    //this line is where the error is thrown
    $smtp = Mail::factory('smtp', array ('host' => $host, 'auth' => true, 'username' => $username, 'password' => $password));

    $mail = $smtp->send($to, $headers, $message);

    if (PEAR::isError($mail)) {
        return "Error: Mail not sent. Message: " . $mail->getMessage();
    } else {
        return "OK";
    }       
}

除了我设置了自己的错误处理函数的页面之外,该函数在任何地方都能正确调用,没有任何错误:

function Func_ErrorHandler($errno, $errstr, $errfile, $errline, array $errcontext) {
    if (error_reporting() == 0) {
        return false;
    }
    if ($errno > 0) {
        throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
    }
}

带有以下错误消息:

不应该静态调用消息“非静态方法 Mail::factory()”的未捕获异常“ErrorException”

失败的示例代码:

set_error_handler("Func_ErrorHandler");
$MAILto      = "info@mydomain.com";
$MAILsubject = "subject";
$MAILmessage = "message";

$sRet = SendMailUtf8($MAILto, $MAILsubject, $MAILmessage);

如果我注释掉set_error_handler("Func_ErrorHandler"); 行,就没有问题。为什么会发生这种情况,我该如何解决?

提前谢谢你。

编辑:Mail.php https://paste.ee/p/LOyBf

【问题讨论】:

  • 这与错误处理程序无关,它的这一行$smtp = Mail::factory(....
  • 如果你不总结错误信息,错误的行号是什么?
  • 实例化一个 MAIL 类的对象,然后调用它为$mail-&gt;factory(...
  • “如果我注释掉 set_error_hanlder() 行,就没有问题。” - 这仅表示您有 default 错误报告设置为忽略警告。
  • 专业提示:不要在 error_reporting 设置为零的情况下进行开发。错误报告可以帮助您不犯错误

标签: php


【解决方案1】:

您的错误处理程序正常工作。没有任何问题。

不应静态调用非静态方法 Mail::factory()

此消息表示发生了 STRICT 级别的错误。如果您的错误报告设置排除了此级别的错误,您将看不到任何内容。例如,如果您将error_reporting 设置为E_ALL &amp; ~E_DEPRECATED &amp; ~E_STRICT,则所有 STRICT 级别的错误都将被排除。但是,您的错误处理程序会将所有错误转换为异常,因此,如果您启用它,则会将 STRICT 级别的错误视为异常。

你有几种方法来决定这个问题:

1.确保使用包中的最新版本和正确的文件(可能是另一个类而不是预期的类)。之前也有这个问题,但是was fixed.

2.您可以制作对象并将方法用作非静态

$mail = new Mail();
$mail->factory(/*some parameters*/);

3.您可以使用error control operator@来抑制代码中的任何错误

$mail = @Mail::factory(/*some parameters*/)

但是错误的方式会造成更多问题,因为所有错误都会被忽略。我添加了它以获得完整的信息。

4.您可以configure the error handler忽略STRICT级别的错误

set_error_handler("Func_ErrorHandler", E_ALL  & ~E_DEPRECATED & ~E_STRICT);

【讨论】:

  • 谢谢你,很好的回答
猜你喜欢
  • 1970-01-01
  • 2015-07-03
  • 2014-09-08
  • 2015-05-28
  • 2013-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多