__construct()A PHP constructor is a special __construct() method that PHP calls automatically every time you instantiate an object with new. Constructors guarantee that every new object starts in a valid, initialized state with all required dependencies and values present.
Before PHP 8, developers had to declare every property three times: as a class property, a constructor parameter, and an assignment line. PHP 8 constructor property promotion combines all three into one clean parameter list by adding visibility (public, private, protected, or readonly) directly inside __construct().
<?php
declare(strict_types=1);
class UserAccount
{
public function __construct(
public readonly int $id,
public string $email,
private string $role = 'member'
) {
if (!filter_var($this->email, FILTER_VALIDATE_EMAIL)) {
throw new InvalidArgumentException('Invalid account email.');
}
}
public function getRole(): string
{
return $this->role;
}
}
$user = new UserAccount(id: 7, email: '[email protected]');
echo "User #{$user->id} ({$user->email}) - Role: {$user->getRole()}" . PHP_EOL;
In clean Laravel and PHP services, constructors accept collaborators like repositories, mailers, or loggers. Constructor injection makes dependencies obvious and allows unit tests to pass fake or mocked collaborators effortlessly.
__construct(): Keep constructors fast and deterministic; validate inputs and assign properties rather than firing HTTP requests on instantiation.__construct(): Constructors never return values. Declaring : void on __construct() causes a fatal error in PHP.parent::__construct() in subclasses: If a child class defines its own constructor, PHP does not call the parent constructor automatically unless you invoke parent::__construct(...).No. PHP supports only one __construct() method per class. To offer alternative creation paths, use named static factory methods like User::fromArray($row).
private?Yes. A private function __construct() prevents direct new ClassName() calls outside the class, commonly used with static factory methods or value objects.
__construct()?Yes. Any parameter without a visibility keyword (public, protected, private, or readonly) behaves as a normal constructor argument.
Sign in to track your learning journey, earn industry-recognized certificates, and join our elite developer community.
Quick Access With
Experiment with the code from this lesson in our interactive playground.