Я работаю с классами и структурой класса объектов, но не на сложном уровне – просто классы и функции, а затем, в одном месте, экземпляр.
Что касается __construct
и __destruct
, расскажите мне очень просто: какова цель конструкторов и деструкторов ?
Я знаю теоретическое объяснение школьного уровня, но я ожидаю чего-то подобного в реальном мире, так как в тех ситуациях мы должны их использовать.
Приведите также пример, пожалуйста.
С уважением
Конструктор – это функция, которая выполняется после инициализации объекта (выделенная память, свойства экземпляра и т. Д.). Его цель – поставить объект в допустимое состояние.
Часто объект, находящийся в пригодном для использования состоянии, требует некоторых данных. Цель конструктора заключается в том, чтобы заставить эти данные присваиваться объекту во время создания экземпляра и запрещать любые экземпляры без таких данных.
Рассмотрим простой класс, который инкапсулирует строку и имеет метод, который возвращает длину этой строки. Одним из возможных вариантов реализации было бы:
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 очищает все ресурсы, хранящиеся в скрипте, когда заканчивается выполнение скрипта.
Изучите пример:
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');
Который меньше кода и выглядит чище!
Примечание. Как правильно утверждают ответы, конструкторы / деструкторы используются для самых разных вещей, в том числе: де инициализация переменных (особенно когда переменная является переменной), деление памяти, инварианты (могут быть превзойдены) и чистый код. Я также хотел бы отметить, что «чистый код» – это не просто «сахар», но и улучшает читаемость, ремонтопригодность и т. Д.
Конструктор класса определяет, что происходит, когда вы создаете экземпляр объекта из этого класса. Деструктор класса определяет, что происходит, когда вы уничтожаете экземпляр объекта.
См. Руководство по конструкторам и деструкторам PHP :
PHP 5 позволяет разработчикам объявлять методы конструктора для классов. Классы, которые имеют метод конструктора, вызывают этот метод для каждого вновь созданного объекта, поэтому он подходит для любой инициализации, которая может понадобиться объекту до его использования.
а также
PHP 5 представляет концепцию деструктора, аналогичную концепции других объектно-ориентированных языков, таких как C ++. Метод деструктора будет вызываться, как только будут удалены все ссылки на конкретный объект или когда объект будет явно уничтожен или в любом порядке в последовательности выключения.
На практике вы используете 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 в дикой природе.
Конструктор запускается во время создания экземпляра вашего класса. Поэтому, если у вас есть класс 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
с$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
Надеюсь, что это поможет продемонстрировать, где вызываются конструктор и деструктор, для чего они полезны?
__construct()
может использовать члены класса по умолчанию с ресурсами или более сложными структурами данных. __destruct()
может освобождать ресурсы, такие как файлы и дескрипторы базы данных. Я нашел, что было легче всего понять, когда я думал о new
ключевом слове перед конструктором: он просто сообщает моей переменной, что новый объект его типа данных будет предоставлен ему, на основе которого я вызываю и что я передаю ему , Я могу определить состояние объекта по прибытии.
Без нового объекта мы бы жили в стране null
и терпели неудачи!
Деструктор является наиболее очевидным с точки зрения C ++, где, если у вас нет метода деструктора, удалите всю указанную память, он останется включенным после выхода программы, что приведет к утечкам и задержкам на ОС клиентов до следующей перезагрузки.
Я уверен, что здесь более чем достаточно хорошей информации, но другой угол всегда полезен из того, что я заметил!