警告:从本应设置的空值创建默认对象

Warning: Creating default object from empty value that should have been set

我是第一次尝试设置邮件系统。 我正在使用 PHPMailer,但是,因为有很多东西要设置,所以我将其包装在另一个 class 中以方便我自己使用,我得到了这个警告:从空值创建默认对象。我的代码是这样的。

class Mail{
public $m;

public function __construct(){
    $m = new PHPMailer;

    //config like isSMTP, Host, Username, Password etc.
    }
}

但是什么时候调用方法像

    public function subject($subject){
         $m->Subject = $subject;
    }

和var_dump($m->主题);我会收到警告:从空值创建默认对象

我的问题是

1.Why 发生错误?

  1. 这是做这类事情的最佳方法吗,还是有更好的方法?(我听说在另一个对象中实例化一个对象不是一个好的做法)

如果你想在你的方法中访问你的 class 属性,你需要使用 $this:

public $m;

public function __construct(){
    $this->m = new PHPMailer;

    //config like isSMTP, Host, Username, Password etc.
}
...
public function subject($subject){
     $this->m->Subject = $subject;
}

PHP 的 OOP 支持最重要的方面之一是 $this 伪变量。它计算为对象在内存中的地址,这就是为什么它不是真正的变量,因为对象的地址可能是不变的。如果没有 $this,方法将无法访问对象属性或其他方法。

如果一个变量$whatever出现在方法中,没有任何迹象表明该变量与对象有任何关系;这只是一个变量。 PHP 访问 属性(或其他方法)的唯一方法是通过 $this,因为伪变量提供了对象的地址。如果 属性 存在,它将是该地址的偏移量。

请注意,您可以使用 $this 做一些强大的事情。例如,如果你return方法中的那个变量,你可以设置方法链,如下:

class test {
    public $m;

    public function setM( $num ){
        $this->m = $num;
        return $this;
    }
    public function getM(){
        return $this->m;
    }
}
echo (new test())->setM(15)->getM(); // 15

现场演示here

手册中关于 $this 的描述似乎存在差异:

$this is a reference to the calling object ... (see http://php.net/manual/en/language.oop5.basic.php)

和PHP的内部源代码表明伪变量实际上是一个指针(参见PHP的内部here),尽管PHP 显示自己没有指针!

无论 $this 的真实性质如何,显然它对于一个方法读取和设置成员变量或调用另一个方法起着至关重要的作用。