Назначение PHP-конструкторов

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

Что касается __construct и __destruct, пожалуйста, расскажите мне очень просто: , что является целью конструкторов и деструкторов?

Я знаю теоретическое объяснение школьного уровня, но я ожидаю нечто подобное в реальном мире, так как в тех ситуациях мы должны их использовать.

Укажите также пример.

Привет

Ответ 1

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

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

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

class StringWrapper {
    private $str;

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

    public function getLength() {
        if ($this->str === null)
            throw new RuntimeException("Invalid state.");
        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 очищает все ресурсы, хранящиеся в script, когда заканчивается выполнение script.

Ответ 2

Изучите пример:

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');

Какой код меньше и выглядит чище!

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

Ответ 3

Конструктор запускается в тот момент, когда вы создаете экземпляр своего класса. Итак, если у вас есть класс Person:

class Person {

    public $name = 'Bob'; // this is initialization
    public $age;

    public function __construct($name = '') {
        if (!empty($name)) {
            $this->name = $name;
        }
    }

    public function introduce() {
        echo "I'm {$this->name} and I'm {$this->age} years old\n";
    }

    public function __destruct() {
        echo "Bye for now\n";
    }
}

Показывать:

$person = new Person;
$person->age = 20;
$person->introduce();

// I'm Bob and I'm 20 years old
// Bye for now

Мы можем переопределить значение по умолчанию, установленное при инициализации через аргумент конструктора:

$person = new Person('Fred');
$person->age = 20;
$person->introduce();

// if there are no other references to $person and 
// unset($person) is called, the script ends 
// or exit() is called __destruct() runs
unset($person);

// I'm Fred and I'm 20 years old
// Bye for now

Надеюсь, это поможет продемонстрировать, как называются конструктор и деструктор, для чего они нужны?

  1. __construct() может использовать членов класса по умолчанию с ресурсами или более сложными структурами данных.
  2. __destruct() может освободить ресурсы, такие как дескрипторы файлов и баз данных.
  3. Конструктор часто используется для составления класса или внедрения конструктора требуемых зависимостей.

Ответ 4

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

См. Руководство по конструкторам и деструкторам PHP:

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

и

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

На практике вы используете Constructor для помещения объекта в минимальное допустимое состояние. Это означает, что вы назначаете аргументы, переданные конструктору свойствам объекта. Если ваш объект использует какие-то типы данных, которые нельзя назначить напрямую как свойство, вы создаете их здесь, например.

class Example
{
    private $database;
    private $storage;

    public function __construct($database)
    {
        $this->database = $database;
        $this->storage = new SplObjectStorage;
    }
}

Обратите внимание, что для того, чтобы ваши объекты проверялись, конструктор не должен выполнять какую-либо реальную работу:

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

В приведенном выше Example, $database является сотрудником. У этого есть жизненный цикл и цель его собственного и может быть общим экземпляром. Вы бы не создали это внутри конструктора. С другой стороны, SplObjectStorage является неотъемлемой частью Example. Он имеет тот же жизненный цикл и не используется совместно с другими объектами. Таким образом, это нормально в new в ctor.

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

Ответ 5

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

Без нового объекта мы будем жить в стране null и сбой!

Деструктор наиболее очевиден с точки зрения С++, где, если у вас нет метода деструктора, удалите всю указанную память, он останется включенным после выхода программы, что приведет к утечкам и задержкам на ОС клиентов до следующей перезагрузки.

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

Ответ 6

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