Просування властивостей (PHP 8.0) дозволяє оголосити властивість і присвоїти їй значення прямо в параметрах конструктора - додаючи модифікатор видимості.
// До PHP 8
class Invoice
{
private string $number;
private int $total;
public function __construct(string $number, int $total)
{
$this->number = $number;
$this->total = $total;
}
}
// PHP 8+
class Invoice
{
public function __construct(
private string $number,
private int $total,
) {}
}
Обидва варіанти створюють однакові властивості. Друге - втричі коротше, і неможливо забути присвоєння.
Що варто знати:
- Просувається лише параметр з модифікатором (
public,protected,private,readonly). Звичайні параметри поруч лишаються просто параметрами. - Можна поєднувати з
readonly:public function __construct(public readonly string $email) {}- незмінний value object у кілька рядків. - Тип обов'язковий не формально, але без нього властивість буде нетипізованою - на практиці тип пишуть завжди.
- Значення за замовчуванням дозволені:
private int $attempts = 3. - Тіло конструктора може бути й не порожнім - там зручно перевіряти інваріанти:
public function __construct(public readonly int $amount)
{
if ($amount < 0) {
throw new InvalidArgumentException('Сума не може бути від\'ємною');
}
}
У Laravel так оголошують залежності сервісів і контролерів: контейнер підставляє їх через параметри конструктора.