Конструктор PHP
Конструкторы — это действительно важная часть объектно-ориентированного программирования на основе классов. С помощью конструкторов вновь созданные объекты автоматически инициализируют свои свойства, прежде чем их можно будет использовать.
Что такое конструктор PHP?
Функции-конструкторы — это особый тип функций (принадлежащие к группе методов, известных как магические методы), которые, в отличие от других функций, вызываются автоматически при создании объекта.
Имена магических методов всегда начинаются с двух подчеркиваний, и магический метод __construct()
не является исключением. Объявление функции-конструктора начинается с двух знаков подчеркивания (__)
и имени __construct
:
Согласно основам PHP ООП конструктор нельзя вызвать более одного раза, но мы можем изменять значения переменных-членов.
Конструктор позволяет нам сразу инициализировать свойства объекта при при его создании.
Если мы создаём функцию __construct()
, то PHP будет автоматически вызывать эту функцию, когда мы будем создавать объект из класса. Обычно мы используем конструктор для установки значения свойства.
В нашем простом примере мы хотим установить значение свойства $model
сразу после создания объекта, поэтому мы добавляем конструктор внутри класса, который устанавливает значение свойства $model
:
Пример
Попробуй сам »<?php
class Car{
private $model;
// метод конструктор
public function __construct($model)
{
$this -> model = $model;
}
}
$car1 = new Car(); // Fatal error: Uncaught ArgumentCountError!!!
?>
Результат выполнения кода:
Почему вышеприведённый сценарий был остановлен и выдал фатальную ошибку?
Чтобы использовать конструктор, мы должны передать аргумент классу со значением свойства (в нашем случае для $model), как только мы создадим объект, но если мы попытаемся создать новый объект, не присваивая значение, которое требуется конструктору, будет возникать ошибка.
Чтобы избежать такой ошибки, мы должны присвоить конструктору значение. Таким образом, в качестве примера мы присваиваем конструктору значение Mercedes
, записывая его в скобках вновь созданного объекта:
$car1 = new Car("Mercedes");
Теперь давайте добавим метод getCarModel()
, чтобы отобразить значение свойства $model автомобиля из только что созданного объекта:
Пример
Попробуй сам »<?php
class Car {
private $model;
// конструктор
public function __construct ($model)
{
$this -> model = $model;
}
public function getCarModel()
{
return ' Модель автомобиля: ' . $this -> model;
}
}
//Мы передаем значение переменной после создания объекта
$car1 = new Car("Mercedes");
echo $car1 -> getCarModel();
?>
Результат выполнения кода:
В приведенном выше примере мы видим, что использование конструктора избавляет нас от необходимости создания и вызова метода setCarModel()
, что сокращает объем кода.
PHP-конструктор с несколькими парамерами
В конструктор можно передавать сразу несколько параметров:
Пример
Попробуй сам »<?php
class Car {
public $model;
public $color;
// конструктор
function __construct ($model, $color) {
$this -> model = $model;
$this -> color = $color;
}
function getCarModel() {
return ' Модель автомобиля: ' . $this -> model;
}
function getCarColor() {
return ' Цвет автомобиля: ' . $this -> color;
}
}
$car1 = new Car("Mercedes", "green");
echo $car1 -> getCarModel();
echo "<br>";
echo $car1 -> getCarColor();
?>
Результат выполнения кода:
Цвет автомобиля: green
Как правильно написать метод конструктора?
Когда мы пытаемся создать объект, у которого есть метод-конструктор, мы рискуем сломать наш код, если не передадим значение конструктору. Чтобы избежать этого, мы можем определить значение по умолчанию для свойств, которые мы хотели бы установить через конструктор. Значение по умолчанию может быть наиболее разумным выбором для свойства: ноль, пустая строка или даже null.
Если мы используем null в качестве значения по умолчанию, мы можем использовать условие, чтобы оценить, было ли передано значение, и затем, если значение передано, присвоить значение свойству.
В приведенном ниже примере мы присваиваем значение по умолчанию null свойству $model
и, только если значение передается конструктору, мы присваиваем это значение свойству. В любом другом случае свойство $model
по умолчанию имеет значение строки "N/A":
Пример
Попробуй сам »<?php
class Car {
// Свойство $model имеет значение по умолчанию "N/A"
private $model = "N/A";
// Нам не нужно присваивать значение свойству $model
// поскольку оно уже имеет значение по умолчанию
public function __construct($model = null) {
// Только в случае передачи значения model ему будет присвоено
if($model) {
$this -> model = $model;
}
}
public function getCarModel() {
return 'Модель автомобиля: ' . $this -> model;
}
}
//Мы создаем новый объект Car, не передавая значение model
$car1 = new Car();
echo $car1 -> getCarModel();
?>
Результат выполнения кода:
Несмотря на то, что мы создали объект без передачи значения свойству model, мы не вызвали ошибку, потому что свойство model в конструкторе имеет значение по умолчанию null
.
С другой стороны, давайте посмотрим, что произойдет, когда мы определим model после создания объекта. В следующем примере мы присваиваем значение "Merceds" в $model сразу при создании объекта $car1:
Пример
Попробуй сам »<?php
class Car {
private $model = "";
public function __construct($model = null) {
// Только в случае передачи значения model ему будет присвоено
if($model) {
$this -> model = $model;
}
}
public function getCarModel() {
return 'Модель автомобиля: ' . $this -> model;
}
}
//Мы создаем новый объект Car передавая значение model
$car1 = new Car('Mercedes');
echo $car1 -> getCarModel();
?>
Результат выполнения кода:
Магические константы
В дополнение к магическим методам язык PHP предлагает несколько магических констант.
Например, мы можем использовать магическую константу __CLASS__
(магические константы записываются прописными буквами с префиксом и суффиксом с двумя подчеркиваниями), чтобы получить имя класса, в котором он находится.
Давайте посмотрим в следующем примере, в котором мы используем магическую константу __CLASS__
в методе getCarModel()
, чтобы получить имя класса:
Пример
Попробуй сам »<?php
class Car {
private $model = '';
public function __construct($model = null) {
if($model) {
$this -> model = $model;
}
}
public function getCarModel() {
//Мы используем магическую константу __CLASS__, чтобы получить имя класса
return " Имя класса: " . __CLASS__ . " модель: " . $this -> model;
}
}
$car1 = new Car('Mercedes');
echo $car1 -> getCarModel();
?>
Результат выполнения кода:
Другие магические константы, которые могут пригодиться при разработке приложений:
__LINE__ — получить номер строки, в которой используется константа.
__FILE__ — получить полный путь или имя файла, в котором используется константа.
__METHOD__ — получить имя метода, в котором используется константа.
Заключение
В этом руководстве мы узнали о магических методах и константах, а также о том, как использовать конструкторы для установки значений свойств сразу же как только мы создаем объекты вне классов. Кликните здесь, чтобы попрактиковаться в этой теме.