Вступ до Destructor в PHP

PHP представив метод деструктора, такий самий, як і в інших мовах OOP, таких як C ++. Як зазначається в назві, деструктор - це значення об'єкта, коли він знищений або коли сценарій переривається або зупиняється. Конструктори є членами спеціальних функцій для новостворених екземплярів об'єкта. Деструктори - це навпаки конструкторів, і вони викликаються, коли створений екземпляр видаляється з пам'яті.

Конструктор викликається функцією __construct (), тоді як деструктор викликається за допомогою функції __destruct (), яку PHP викликає автоматично внизу скрипту. Якщо в основному жодне з посилань не залишається на об'єкт в будь-якому порядку, деструктор автоматично викликається.

Основний синтаксис виклику деструктора: Функція __destruct (),

Синтаксис:

__destruct ( void ) : void

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

<_?php
class (
// Declaring a constructor
function __construct() (
// To initialize required properties
)
// Declaring a destructor
function __destruct() (
// To remove reference of an object
)
)
?>

Робота деструктора в PHP

В основному деструктором керує збирач сміття, який очищає об'єкт, коли він більше не потрібен. Він не може приймати жодних аргументів як вхідних даних на відміну від конструктора.

Цей метод також використовується для очищення ресурсів та звільнення пам'яті для розміщення більше. Перевантаження не можна виконувати з деструкторами, і лише один деструктор може існувати в одному класі. Ще одна його унікальна особливість полягає в тому, що навіть якщо скрипт припинив його виконання за допомогою команди exit (), деструктор все одно буде викликатися. Цей вихід () не дозволить методам відключення залишків вийти з системи.

Приклади Destructor в PHP

Візьмемо кілька прикладів, щоб краще зрозуміти деструктор:

Приклад №1

Це простий приклад, коли ми створюємо основну функцію конструктора, а потім знищуємо ту саму, викликаючи функцію деструктора.

Код:

<_?php
class DestructableExample
(
function __construct() (
print "Inside constructor\n";
)
function __destruct() (
print "Destroying the class " . __CLASS__ . "\n";
)
)
$obj = new DestructableExample();

Вихід:

Приклад №2

Для цього прикладу ми використовуємо дві змінні в конструкторі; ім'я та прізвище працівника, а потім ми знищуємо об'єкт Співробітник безпосередньо до закінчення коду PHP, викликаючи деструктора.

Код:

<_?php
class Employee (
// Employee's first name
private $emp_fname;
// Employee's last name
private $emp_lname;
// Declaration of constructor
public function __construct($emp_fname, $emp_lname) (
echo "Initialisation of object as follows…
";
$this->emp_fname = $emp_fname;
$this->emp_lname = $emp_lname;
)
// Declaration of destructor
public function __destruct()(
// Here we can clean the resources
echo "Removing the Object…";
)
// This method is being used to display full name
public function showName() (
echo "Employee full name is: " . $this->emp_fname . " " . $this->emp_lname . "
";
)
)
// Class object declaration
$harry = new Employee("Harry", "Potter");
$harry->showName();
?>

Вихід:

Приклад №3

У цьому прикладі ми побачимо, як обробляти файл test_doc.txt, який є необхідним текстовим документом, який повинен бути в тому ж робочому каталозі, що і основний файл. Обов’язково включіть текст у test_doc.txt, який потрібно відобразити як частину коду.

fopen - це вбудована функція, яка використовується для відкриття файлу, а fread - це функція, що використовується для зчитування вмісту файлу. Тут деструктор буде викликаний закрити / знищити файл-файл.

Код:

<_?php
header("Content-type: text/plain");
class Example (
/**
* Declaring an identifier
* variable- string
*/
private $first_name;
/**
* A reference to another Foo object
* variable Foo
*/
private $setlink;
public function __construct($first_name) (
$this->first_name = $first_name;
)
public function setLink(Example $setlink)(
$this->setlink = $setlink;
)
public function __destruct() (
echo 'Destroying: ', $this->first_name, PHP_EOL;
)
)
// We are creating 2 objects here
$obj1 = new Example('Example 1');
$obj2 = new Example('Example 2');
// Objects are made to point to themselves
$obj1->setLink($obj1);
$obj2->setLink($obj2);
// Destroying their global references
$obj1 = null;
$obj2 = null;
// Since both objects are declared null we cannot access them now and hence they must be destroyed
// but since they are not yet destroyed a memory leak may occur as they are still present.
//
// Garbage collector can be called as shown in below line. Uncomment to check its functionality
// gc_collect_cycles();
// Now we create 2 more objects but will not set their references
// only the obj1 and obj2 are pointing to them right now
$obj1 = new Example('Example 3');
$obj2 = new Example('Example 4');
// Removing their global references
$obj1 = null;
$obj2 = null;
// Now the Example 3 and example 4 cannot be accessed due to no references
// for them. Hence the destructor is called automatically
// previous to the execution of next line
echo 'Script has ended', PHP_EOL;
?>

Вихід:

Як зазначено в коді, якщо ми відмежуємо функцію gc_collect_cycles () в центрі сценарію, ми отримуємо вихід, як показано нижче:

Приклад №4

<_?php
class FileHandle(
private $file_handle;
private $name;
/**
* We declare file handle with parameters file name and mode
* Using parameter string $name as file name
* Using parameter string $fmode as file mode for read, write
*/
public function __construct($name, $fmode)(
$this->name = $name;
$this->file_handle = fopen($name, $fmode);
)
/**
* We are closing the file handle
*/
public function __destruct()(
if($this->file_handle)(
fclose($this->file_handle);
)
)
/**
* Reading and printing file's content
*/
public function display()(
echo fread($this->file_handle, filesize($this->name));
)
)
$fu = new FileHandle('./test_doc.txt', 'r');
$fu->display();
?>

Вихід:

Наступне попередження видається, якщо test_doc.txt не створено.

Переваги Деструкторів

  • Деструктори допомагають звільнити розподіл пам'яті, таким чином забезпечуючи необхідний простір для новостворених об’єктів конструктором або звільняючи ресурси для будь-якого іншого завдання.
  • Забезпечує те, що всі завдання виконуються ефективно, оскільки він піклується про процес очищення.
  • У випадках, коли виділено багато змінних та структур, використання деструкторів допоможе запобігти витоку пам'яті, звільнивши внутрішні ресурси.
  • Він опікується як статичними, так і локальними змінними.

Обмеження деструкторів

  • Деструктори не можуть приймати жодних параметрів, а також не дають поверненого значення (навіть недійсного).
  • Спадкування заборонено через деструктори
  • Не обов’язково, що деструктор буде статичним
  • Посилання на адресу деструктора неможливо
  • Об'єкт, що належить до класу, що містить деструктор, не може бути членом об'єднання.
  • Обов'язково, щоб функція деструктора мала доступ до публіки.

Висновок

Як ми бачили, деструктори, що є точно зворотною стороною конструкторів, використовуються для знищення об'єкта після його використання та не вимагаються далі в коді. Таким чином, гарантуючи, що вона очищає небажані ресурси, забезпечуючи простір для майбутніх ресурсів. Це робиться шляхом оголошення функції __destruct (), яка буде викликана PHP автоматично в кінці сценарію.

Рекомендовані статті

Це посібник із програми Destructor на PHP. Тут ми обговорюємо роботу, переваги та обмеження деструктора в PHP разом із прикладами. Ви також можете переглянути наступні статті, щоб дізнатися більше -

  1. Асоціативний масив у PHP
  2. Квадратний корінь в PHP
  3. Функції в PHP
  4. Отримати IP-адресу в PHP