2017-07-03 75 views
-1

我不经常使用类,但一直试图让我的代码更容易管理。我试图扩展PHPMailer,然后创建对象并发送邮件,但是在扩展类中使用$ this函数时遇到问题。

require 'phpmailer/PHPMailerAutoload.php'; 

class Mailz extends PHPMailer { 
    public $From  = '[email protected]'; 
    public $FromName = 'Examplemail'; 
    public $Host  = 'mail.example.com'; 
    public $SMTPAuth = true; 
    public $Username = '[email protected]'; 
    public $Password = '123example'; 
    public $SMTPSecure = 'ssl'; 
    public $Port = 465; 
    public $Priority = 1; 
    public $CharSet  = 'UTF-8'; 
    public $Encoding = '8bit'; 
    public $Content = 'text/html'; 

    public function send() { 
     return parent::send(); 
    } 

/* 
* welcome email 
*/ 

public static function sendWelcome($email,$password) { 

    $message = str_replace(
     array(
     '[body]', 
      '[first_name]', 
      '[email_address]', 
      '[password]' 

     ), 
     array(
     $body = 'Lorem ipsum yadadada', 
     $email_address = $email, 
     $password, 
     ), 
     file_get_contents('welcome.html') 
    ); 

    $this->Subject = 'Subject Line!'; 
    $this->Body = $message; 

    if(!$this->send()) { 
     echo 'Message could not be sent.'; 
     echo 'Mailer Error: ' . $this->ErrorInfo; 
    } else { 
     echo 'Message has been sent'; 
    } 


    } 
} 


$sendemail = new Mailz(); 
$sendemail->sendWelcome('[email protected]','P4$$w0rd'); 

我一直试图用不同的方式修复它几个小时,但我没有更接近寻找解决方案。我目前收到的错误是:未捕获的错误:使用$ this,而不是在此行上的对象上下文中 - $ this-> Subject ='Subject Line!';同样可能会发生$ this的其他用途。

我错过了什么!

回答

1

你的函数是静态的。 $这不是在静态函数中设置的。

sendWelcome功能删除static关键字,它应该正常工作

+0

明白了,现在对静态功能有了更好的理解。我没有在课堂上使用它们,显然将它从我的普通函数文件移动到课堂上有助于创建这个问题。 现在完美工作,谢谢! – Erbilacx

0

不能在静态方法使用$this,但是如果要使用静态尝试进行的self的对象。

$mailer = new self(); 
$mailer->Subject = ''; 

这种方式,你可以打电话给你的班级,如果没有instanciating如果喜欢。

Mailz::sendWelcome(<subject>, <password>); 

或者您可以简单地从方法声明中删除静态。

1

您尝试使用静态函数内的$this关键字,但你不要在静态情况下,当有你的类的实例来指代与$this,所以你会得到一个错误。

+1

明白了,现在对静态函数有了更好的理解。我没有在课堂上使用它们,显然将它从我的普通函数文件移动到课堂上有助于创建这个问题。 现在完美工作,谢谢! – Erbilacx