PHP позволяет объявить метод конструктора с именем __construct() для класса следующим образом:
<?php
class ClassName
{
function __construct()
{
// implementation
}
}
Когда вы создаете экземпляр класса, PHP автоматически вызывает метод конструктора:
$object = new ClassName()
Обычно конструктор используется для инициализации свойств объекта.
В следующем примере определяется конструктор для класса BankAccount. Конструктор инициализирует свойства $accountNumber и $balance.
<?php
class BankAccount
{
private $accountNumber;
private $balance;
public function __construct($accountNumber, $balance)
{
$this->accountNumber = $accountNumber;
$this->balance = balance;
}
}
Поскольку конструктор имеет два параметра, вам необходимо передать соответствующие аргументы при создании объекта BankAccount:
$account = new BankAccount(1, 100);
В этом примере PHP автоматически вызывает __construct () класса BankAccount. Следовательно, он назначает аргументы $accountNumber и $balance свойствам $accountNumber и $balance объекта.
На практике вам часто требуется присвоить аргументы конструктора соответствующим свойствам.
<?php
class BankAccount
{
private $accountNumber;
private $balance;
function __construct($accountNumber, $balance)
{
$this->accountNumber = $accountNumber;
$this->balance = balance;
}
}
Чтобы улучшить это, PHP 8.0 представил новую концепцию, называемую продвижением конструктора, которая продвигает аргументы конструктора в свойства.
<?php
class BankAccount
{
function __construct( private $accountNumber, private $balance)
{
}
}
Когда параметр конструктора включает модификатор доступа (открытый, закрытый или защищенный), PHP будет рассматривать его как аргумент конструктора и свойство объекта одновременно. И он присваивает свойству аргумент конструктора.
Иногда вы не хотите продвигать аргументы конструктора, вы можете удалить модификатор доступа. Например:
<?php
class BankAccount
{
function __construct(private $accountNumber, private $balance, $type)
{
}
}
В этом примере аргумент $type не имеет модификатора доступа. Следовательно, это обычный параметр, и он не будет преобразован в свойство.
Обратите внимание, что порядок продвинутых аргументов и непродвинутых аргументов может отображаться в конструкторе в любом порядке.