PHP Учебник

PHP Старт Введение в PHP Установка PHP Синтаксис PHP Комментарии в PHP Переменные PHP PHP Echo / Print Типы данных PHP Строки PHP Числа PHP Математика в PHP Константы PHP Операторы PHP PHP If...Else...Elseif PHP Switch Циклы в PHP Функции PHP Массивы PHP PHP Суперглобальные PHP RegEx

PHP Формы

Обработка форм PHP Валидация форм PHP Обязательные поля Валидация URL/E-mail Полная форма PHP

PHP Продвинутый

PHP Дата и время PHP Include/Require PHP Работа с файлами Открытие/Чтение файлов Создание/Запись файлов PHP Загрузка файлов Файлы cookie PHP Сессии PHP Фильтры PHP Расширенные фильтры PHP Функция Callback PHP JSON PHP Исключения

PHP OOP

Что такое ООП в PHP Классы/Объекты PHP Цепочки методов PHP Конструктор PHP Деструктор PHP Модификаторы доступа Наследование в PHP Константы класса PHP Подсказка типов PHP Подсказка интерфейсов Абстрактные классы PHP PHP Интерфейсы PHP Полиформизм PHP Трейты Статические методы PHP Статические свойства PHP Пространства имен PHP Итерируемые объекты

База данных MySQL

База данных MySQL Подключение к MySQL Создание БД MySQL Создание таблицы MySQL Вставка данных MySQL Получить ID MySQL Подготовленные операторы PHP MySQL Получение данных MySQL Предложение WHERE Предложение ORDER BY Обновление данных MySQL Удаление данных БД MySQL Limit Data

PHP XML

Парсеры PHP XML Парсер PHP SimpleXML Получить PHP SimpleXML PHP XML Expat PHP XML DOM

PHP - AJAX

AJAX Введение AJAX PHP AJAX База Данных AJAX XML AJAX Живой поиск AJAX Опрос

PHP Примеры

PHP Примеры Практика ООП PHP PHP квиз-тест Упражнения Базовый PHP Упражнения Алгоритмы Упражнения Массивы Упражнения Цикл for Упражнения Функции Регулярные выражения Упражнения Дата PHP Упражнения Строки PHP Математика PHP Упражнения Формы PHP Упражнения Классы PHP Упражнения JSON PHP PHP Задачник


Конструктор PHP




Конструкторы — это действительно важная часть объектно-ориентированного программирования на основе классов. С помощью конструкторов вновь созданные объекты автоматически инициализируют свои свойства, прежде чем их можно будет использовать.


Функции-конструкторы — это особый тип функций (принадлежащие к группе методов, известных как магические методы), которые, в отличие от других функций, вызываются автоматически при создании объекта.

Имена магических методов всегда начинаются с двух подчеркиваний, и магический метод __construct() не является исключением. Объявление функции-конструктора начинается с двух знаков подчеркивания (__) и имени __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!!!
?>

Результат выполнения кода:

Fatal error: Uncaught ArgumentCountError

Почему вышеприведённый сценарий был остановлен и выдал фатальную ошибку?

Чтобы использовать конструктор, мы должны передать аргумент классу со значением свойства (в нашем случае для $model), как только мы создадим объект, но если мы попытаемся создать новый объект, не присваивая значение, которое требуется конструктору, будет возникать ошибка.

$car1 = new Car(); // Fatal error

Чтобы избежать такой ошибки, мы должны присвоить конструктору значение. Таким образом, в качестве примера мы присваиваем конструктору значение 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();
?>

Результат выполнения кода:

Модель автомобиля: Mercedes

В приведенном выше примере мы видим, что использование конструктора избавляет нас от необходимости создания и вызова метода setCarModel(), что сокращает объем кода.

В конструктор можно передавать сразу несколько параметров:

<?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();
?>

Результат выполнения кода:

Модель автомобиля: Mercedes
Цвет автомобиля: 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();
?>

Результат выполнения кода:

Модель автомобиля: N/A

Несмотря на то, что мы создали объект без передачи значения свойству 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();
?>

Результат выполнения кода:

Модель автомобиля: Mercedes

В дополнение к магическим методам язык 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();
?>

Результат выполнения кода:

Имя класса: Car модель: Mercedes

Другие магические константы, которые могут пригодиться при разработке приложений:

__LINE__ — получить номер строки, в которой используется константа.
__FILE__ — получить полный путь или имя файла, в котором используется константа.
__METHOD__ — получить имя метода, в котором используется константа.

В этом руководстве мы узнали о магических методах и константах, а также о том, как использовать конструкторы для установки значений свойств сразу же как только мы создаем объекты вне классов. Кликните здесь, чтобы попрактиковаться в этой теме.