доступ к публичным свойствам класса в php 7.3

139
03 декабря 2019, 02:00

Есть конструкция вида:

class EmailSendPassword extends Mailable
{
    use Queueable, SerializesModels;
    public $user;
    public $password;
    public function __construct($user, $password)
    {
        $this->user = $user;
        $this->password = $password;
    }
    public function build()
    {
        return $this
            ->subject('Ваш пароль на сайте ' . env('APP_NAME'))
            ->markdown('emails.sendpass', compact('user', 'password'));
    }
}

Так вот, функция compact начиная с php 7.3 начинает выдавать ошибку, связанную с тем, что переменная user не определена. В документации, касаемо изменений в php 7.3 связанной с функцией compact только это замечание:

compact() now issues an E_NOTICE level error if a given string refers to an unset variable. Formerly, such strings have been silently skipped.

Подскажите, в чем ошибка? Разумеется, если в методе build() прописать $user = $this->user проблема решается, но как обойтись без этих костылей?

Answer 1

Все верно, до php7.3 не выводилось ничего, если переменная не определена, поэтому было исправлено. Т.е. фактически без определенных в данной оболасти видимости переменных, вызывая compact('definedVar','undefinedVar1','undefinedVar2') мы получали ассоциативный массив только тех переменных, которые доступны в текущей области видимости

И мое субъективное мнение, что это несовсем правильно.

Соответсвенно ваш код при вызове compact не передавал переменные во вьюху. Что в принципе (мне кажется) не совсем то, что ожидается.

Поэтому в каждом случае погони за красотой кода не следует забывать о его работоспособности. Вот так будет работать:

public function build()
{
    return $this
        ->subject('Ваш пароль на сайте ' . env('APP_NAME'))
        ->markdown('emails.sendpass', [
            'user' => $this->user,
            'password' => $this->password
        ]);
}

И это уж точно не костыль

READ ALSO
Оптимизация PNG на PHP с помощью GD

Оптимизация PNG на PHP с помощью GD

Можно ли сжать картинку PNG, не утратив при этом её прозрачность и сохранив в новый файл, как это делается? Просмотр десятка тематических статей...

109
constexpr static метод

constexpr static метод

Изучаю C++, полез в constexpr, но почти сразу наткнулся на странностиУ меня есть класс Date, который хранит дату, у него есть метод static bool isLeapYear(unsigned...

139
c++ объект статической инициализации map<T1,T2>

c++ объект статической инициализации map<T1,T2>

Не получается правильно сконструировать класс для статической инициализации map<T1,T2>, ругается на синтаксис и просит точку с запятой там...

127
GTK+ программа не изменяет стиль

GTK+ программа не изменяет стиль

На Debian 98 c Gnome GTK+ программа не изменяет стиль

146