Constructor property promotion creates and initializes a property in one place.

compact initialization Promoted constructor properties reduce repeated boilerplate for simple value objects.

Constructor Promotion

lessons
constructor_promotion.php
Replay: real traced execution (multi-file project)
<?php
class Course
{
    public function __construct(private string $title, private int $lessons)
    {
    }

    public function summary(): string
    {
        return $this->title . ":" . $this->lessons;
    }
}

$lessons = 4;
$summary = (new Course("PHP", $lessons))->summary();

echo "lessons=" . $lessons . "\n";
echo "summary=" . $summary . "\n";
<?php
class Course
{
    public function __construct(private string $title, private int $lessons)
    {
    }

    public function summary(): string
    {
        return $this->title . ":" . $this->lessons;
    }
}

$lessons = 2;
$summary = (new Course("PHP", $lessons))->summary();

echo "lessons=" . $lessons . "\n";
echo "summary=" . $summary . "\n";
<?php
class Course
{
    public function __construct(private string $title, private int $lessons)
    {
    }

    public function summary(): string
    {
        return $this->title . ":" . $this->lessons;
    }
}

$lessons = 8;
$summary = (new Course("PHP", $lessons))->summary();

echo "lessons=" . $lessons . "\n";
echo "summary=" . $summary . "\n";
  1. $lessons ← 4

    14$lessons→ 4 = 4; //@lessons=2, 815$summary = (new Course("PHP", $lessons4))->summary();
  2. public function __construct(private string $title, private int $lesson…

    3{4    public function __construct(private string $titlePHP, private int $lessons4)5    {6    }
  3. public function summary(): string

    8public function summary(): string9{10    return $this->titlePHP . ":" . $this->lessons4;11}
  4. $summary ← PHP:4

    14$lessons = 4; //@lessons=2, 815$summary→ PHP:4 = (new Course("PHP", $lessons4))->summary();1617echo "lessons=" . $lessons4 . "\n";18echo "summary=" . $summaryPHP:4 . "\n";
    outputlessons=4
    summary=PHP:4
  1. $lessons ← 2

    14$lessons→ 2 = 2;15$summary = (new Course("PHP", $lessons2))->summary();
  2. public function __construct(private string $title, private int $lesson…

    3{4    public function __construct(private string $titlePHP, private int $lessons2)5    {6    }
  3. public function summary(): string

    8public function summary(): string9{10    return $this->titlePHP . ":" . $this->lessons2;11}
  4. $summary ← PHP:2

    14$lessons = 2;15$summary→ PHP:2 = (new Course("PHP", $lessons2))->summary();1617echo "lessons=" . $lessons2 . "\n";18echo "summary=" . $summaryPHP:2 . "\n";
    outputlessons=2
    summary=PHP:2
  1. $lessons ← 8

    14$lessons→ 8 = 8;15$summary = (new Course("PHP", $lessons8))->summary();
  2. public function __construct(private string $title, private int $lesson…

    3{4    public function __construct(private string $titlePHP, private int $lessons8)5    {6    }
  3. public function summary(): string

    8public function summary(): string9{10    return $this->titlePHP . ":" . $this->lessons8;11}
  4. $summary ← PHP:8

    14$lessons = 8;15$summary→ PHP:8 = (new Course("PHP", $lessons8))->summary();1617echo "lessons=" . $lessons8 . "\n";18echo "summary=" . $summaryPHP:8 . "\n";
    outputlessons=8
    summary=PHP:8