Предупреждение: создание объекта по умолчанию из пустого значения, которое должно быть установлено

0

Я пытаюсь настроить почтовую систему в первый раз. Я использую 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. Это лучший способ сделать это, или есть лучший способ? (Я слышал, что экземпляр объекта внутри другого объекта не является хорошей практикой)
Теги:
oop

2 ответа

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

Живая демо здесь

По-видимому, существует расхождение между тем, что говорится в руководстве: $ this:

$ это ссылка на вызывающий объект... (см. http://php.net/manual/en/language.oop5.basic.php)

и внутренний исходный код PHP, который указывает, что псевдопеременная на самом деле является указателем (см. здесь внутренние функции PHP), несмотря на то, что PHP представляет собой не имеющий указателей!

Какова бы ни была истинная природа $ this, она явно играет критическую роль для метода чтения и установки переменных-членов или для вызова другого метода.

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;
}
  • 0
    Ой ну спасибо. Я полностью забыл об этом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню