Uvod u Destructor u PHP-u

PHP je uveo metodu destruktora jednaku onoj koja postoji u drugim OOP jezicima kao što je C ++. Kao što ime kaže, destruktor je značenje objekta kada je uništen ili kada je skripta prekinuta ili zaustavljena. Konstruktori su članovi posebnih funkcija za novostvorene primjerke objekta. Destruktori su upravo suprotnost konstruktorima i zovu ih kad se stvorena instanca izbriše iz memorije.

Konstruktor se zove funkcijom __construct (), dok se destruktor naziva funkcijom __destruct () koju PHP automatski poziva na dnu skripte. Kada u osnovi nijedna referenca ne ostavi nekog objekta bilo kojim redoslijedom, automatski se poziva destruktor.

Osnovna sintaksa za pozivanje destruktora: Funkcija __destruct (),

Sintaksa:

__destruct ( void ) : void

Za svaki destruktor koji se može pozvati, mora biti konstruktor prije njega kao što je prikazano u nastavku:

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

Rad Destruktora u PHP-u

Destruktorom u osnovi upravlja sakupljač smeća koji čisti predmet kada više nije potreban. Ne može uzeti nikakve argumente kao svoj ulaz za razliku od konstruktora.

Ova metoda se također koristi za čišćenje resursa i za oslobađanje memorije za smještaj više. Preopterećenje se ne može izvršiti s destruktorima i samo jedan destruktor može postojati u istoj klasi. Još jedna njegova jedinstvena karakteristika je da će destruktor i dalje biti pozvan, čak i ako je skripta zaustavila njegovo izvršavanje pomoću naredbe exit (). Ovaj izlaz () neće dopustiti da se metode zaostatka od prestanka napuštanja.

Primjeri Destruktora u PHP-u

Uzmimo nekoliko primjera za bolje razumijevanje destruktora:

Primjer 1

Ovo je jednostavan primjer gdje stvaramo osnovnu funkciju konstruktora, a zatim je uništavamo pozivajući funkciju destruktora.

Kodirati:

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

Izlaz:

Primjer 2

Za ovaj primjer koristimo dvije varijable u konstruktoru; ime i prezime zaposlenika, a zatim uništavamo objekt Zaposlenik neposredno prije završetka PHP koda pozivanjem destruktora.

Kodirati:

<_?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();
?>

Izlaz:

Primjer 3

U ovom ćemo primjeru vidjeti kako treba obraditi datoteku test_doc.txt koja je preduvjet tekstualnog dokumenta kako bi bio prisutan u istoj radnoj mapi kao i glavna datoteka. Obavezno uključite neki tekst u test_doc.txt koji treba biti prikazan kao dio koda.

fopen je ugrađena funkcija koja se koristi za otvaranje datoteke, a fread je funkcija koja se koristi za čitanje sadržaja datoteke. Ovdje će se pozvati destruktor da zatvori / uništi datoteku.

Kodirati:

<_?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;
?>

Izlaz:

Kao što je spomenuto u kodu, ako komentiramo funkciju gc_collect_cycles () u središtu skripte, dobit ćemo izlaz na sljedeći način:

Primjer 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();
?>

Izlaz:

Ako test_doc.txt nije stvoren, slijedeće upozorenje se baca.

Prednosti Destruktora

  • Destruktori pomažu u oslobađanju raspodjele memorije čime konstruktor osigurava potreban prostor za novoizrađene objekte ili oslobađa resurse za bilo koji drugi zadatak.
  • Osigurava da se svi zadaci učinkovito odvijaju jer vodi računa o procesu čišćenja.
  • U slučajevima kada je dodijeljeno mnogo varijabli i struktura, uporaba destruktora pomoći će u sprečavanju istjecanja memorije oslobađanjem unutarnjih resursa.
  • Vodi računa o statičkim i lokalnim varijablama.

Ograničenja Destruktora

  • Destruktori ne mogu podnijeti nijedan parametar, a također ne daju povratnu vrijednost (čak ni neispravnu).
  • Nasljeđivanje nije dopušteno putem destruktora
  • Nije obvezno da destruktor bude statički
  • Pozivanje na adresu destruktora nije moguće
  • Predmet koji pripada klasi koja sadrži destruktor nije dopušteno biti član sindikata.
  • Obavezno je da destruktivna funkcija ima javni pristup.

Zaključak

Kao što smo vidjeli, destruktori koji su točno obrnuti konstruktori koriste se za uništavanje objekta nakon što se njegova upotreba izvrši i nije potrebno dalje u šifri. Na taj način osigurava se da očisti neželjene resurse, omogućavajući prostor budućim resursima. To se postiže deklariranjem funkcije __destruct () koju će PHP automatski pozvati na kraju skripte.

Preporučeni članci

Ovo je vodič za Destructor u PHP-u. Ovdje smo raspravljali o radu, prednostima i ograničenjima destruktora u PHP-u zajedno s primjerima. Možete pogledati i sljedeće članke da biste saznali više -

  1. Niz asocijativnog u PHP-u
  2. Kvadratni korijen u PHP-u
  3. Funkcije u PHP-u
  4. Dohvati IP adresu u PHP-u

Kategorija: