Въведение в 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
)
)
?>

Работа на Destructor в PHP

Destructor се управлява основно от Garbage Collector, който изчиства обект, когато вече не е необходим. Той не може да приема никакви аргументи като свой вход, за разлика от конструктора.

Този метод се използва и за почистване на ресурси и за освобождаване на паметта за настаняване на повече. Не може да се извършва претоварване с деструктори и само един разрушител може да съществува в същия клас. Друга негова уникална особеност е, че дори и скриптът да е спрял изпълнението му с помощта на команда изход (), деструкторът пак ще се извиква. Този изход () няма да позволи методите за изключване на остатъците да се откажат.

Примери за 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 не е създаден.

Предимства на Destructors

  • Разрушителите помагат за освобождаване на разпределението на паметта, като по този начин се уверяват, че необходимото пространство има за новосъздадените обекти от конструктора или освобождават ресурси за всяка друга задача.
  • Гарантира, че всички задачи се изпълняват ефективно, тъй като се грижи за процеса на почистване.
  • В случаите, когато са разпределени много променливи и структури, използването на деструктори ще помогне да се предотврати изтичане на паметта чрез освобождаване на вътрешни ресурси.
  • Той се грижи както за статичните, така и за локалните променливи.

Ограничения на разрушителите

  • Деструкторите не могат да приемат никакви параметри и също така не дават възвратна стойност (дори невалидна).
  • Наследяването не е разрешено чрез разрушители
  • Не е задължително деструкторът да е статичен
  • Позоваването на адрес на деструктор не е възможно
  • Обект, който принадлежи към класа, съдържащ деструктора, не е позволено да бъде член на съюза.
  • Задължително е функцията на деструктора да има обществен достъп.

заключение

Както видяхме, разрушителите, които са точно обратната страна на конструкторите, се използват за унищожаване на обект след неговото използване и не се изисква допълнително в кода. По този начин се гарантира, че изчиства нежеланите ресурси, позволявайки място за бъдещи ресурси. Това става чрез деклариране на функцията __destruct (), която ще бъде извикана от PHP автоматично в края на скрипта.

Препоръчителни статии

Това е ръководство за Destructor в PHP. Тук обсъждаме работата, предимствата и ограниченията на деструктора в PHP заедно с примери. Можете също да разгледате следните статии, за да научите повече -

  1. Асоциативен масив в PHP
  2. Квадратни корени в PHP
  3. Функции в PHP
  4. Вземете IP адрес в PHP