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

时间:2015-01-08 21:32:29

标签: php oop

我第一次尝试设置邮件系统。 我正在使用PHPMailer,但是,由于设置了很多东西,我将它包装在另一个类中以使自己更容易,我有这个警告:从空值创建默认对象。我的代码就像。

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.为什么发生错误?

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

2 个答案:

答案 0 :(得分:3)

如果您想在方法中访问您的类属性,则需要使用$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;
}

答案 1 :(得分:0)

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

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

注意,你可以用$ this做一些有用的东西。例如,如果在方法中返回该变量,则可以设置方法链,如下所示:

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是对调用对象的引用...(请参阅http://php.net/manual/en/language.oop5.basic.php

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

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