0

Какова цель конструкторов и деструкторов в PHP?

11

Я работаю с простыми классами, которые содержат методы для создания объектов.

Какова цель конструкторов классов (__construct) и деструкторов (__destruct)? В каких ситуациях нам нужно их использовать?

Пожалуйста, приведите также пример.

3 ответ(ов)

0

Конструктор — это функция, которая выполняется после инициализации объекта (выделения памяти, копирования свойств экземпляра и т.д.). Его основное предназначение — привести объект в корректное состояние.

Часто для использования объекта необходимо, чтобы он имел определённые данные. Конструктор позволяет обеспечить наличие этих данных во время создания экземпляра и запрещает создание экземпляров без обязательных данных.

Рассмотрим простой класс, который инкапсуляет строку и имеет метод для получения длины этой строки. Одна из возможных реализаций может выглядеть так:

class StringWrapper {
    private $str;

    public function setInnerString($str) {
        $this->str = (string) $str;
    }

    public function getLength() {
        if ($this->str === null)
            throw new RuntimeException("Неверное состояние.");
        return strlen($this->str);
    }
}

Для того чтобы объект находился в корректном состоянии, нужно вызывать setInnerString перед getLength. С помощью конструктора можно гарантировать, что все экземпляры будут находиться в корректном состоянии при вызове getLength:

class StringWrapper {
    private $str;

    public function __construct($str) {
        $this->str = (string) $str;
    }

    public function getLength() {
        return strlen($this->str);
    }
}

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

Деструктор вызывается, когда объект собирается быть освобождён из памяти. Обычно он содержит код для очистки (например, закрытие файловых дескрипторов, которые удерживает объект). Деструкторы в PHP встречаются довольно редко, так как PHP освобождает все ресурсы, удерживаемые скриптом, при завершении его выполнения.

0

Вопрос: Какова польза от использования конструктора в классе на примере следующего кода?

class Person {
  public $name;
  public $surname;
  public function __construct($name, $surname){
    $this->name = $name;
    $this->surname = $surname;
  }
}

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

$person = new Person();
$person->name = 'Christian';
$person->surname = 'Sciberras';

вы можете сделать это одним выражением:

$person = new Person('Christian', 'Sciberras');

Это не только сокращает количество строк кода, но и делает код более читаемым и аккуратным!

Следует отметить, что, как правильно подметили участники обсуждения ниже, конструкторы и деструкторы могут использоваться для множества целей, включая инициализацию/деинициализацию переменных (особенно когда значение переменной меняется), управление памятью, соблюдение инвариантов и упрощение кода. Я также хотел бы подчеркнуть, что "чистый код" — это не просто "сладость", но он также улучшает читаемость, поддерживаемость и устойчивость к ошибкам.

0

Я заметил, что проще всего понять работу оператора new, если рассматривать его перед конструктором: он просто говорит переменной, что ей будет предоставлен новый объект своего типа, в зависимости от того, какой конструктор я вызываю и какие параметры передаю. Таким образом, я могу задать состояние объекта при его создании.

Без этого нового объекта мы бы оказались в мире null, что привело бы к ошибкам и сбоям!

Что касается деструктора, это наиболее очевидно с точки зрения C++. Если вы не определите метод деструктора и не освободите всю память, на которую ссылается объект, эта память останется занятой даже после завершения программы, что будет вызывать утечки и замедление работы операционной системы клиента до следующей перезагрузки.

Я уверен, что здесь уже достаточно полезной информации, но другой угол зрения всегда может быть полезен!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь