php:set_error_handler导致非静态方法Mail :: factory()不应被静态调用

时间:2019-01-08 13:10:11

标签: php

我具有以下邮件发送功能:

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

1 个答案:

答案 0 :(得分:3)

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

  

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

此消息表示发生STRICT级别错误。而且,如果您的错误报告设置排除了此级别的错误,您将看不到任何内容。例如,如果将error_reporting设置为E_ALL & ~E_DEPRECATED & ~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);