Введение в деструктор в PHP

PHP ввел метод деструктора, такой же, который присутствует в других языках ООП, таких как 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 (), деструктор все равно будет вызван. Этот метод exit () не позволит завершить работу оставшихся методов завершения работы.

Примеры деструктора в PHP

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

Пример № 1

Это простой пример, где мы создаем базовую функцию конструктора, а затем уничтожаем ее, вызывая функцию деструктора.

Код:

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

Выход:

Пример № 2

Для этого примера мы используем две переменные в конструкторе; имя и фамилия сотрудника, а затем мы уничтожаем объект Employee перед тем, как код 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