Uvod v Destructor v PHP

PHP je uvedel metodo destruktorja, enako kot v drugih jezikih OOP, kot je C ++. Kot navaja ime, je destruktor pomen predmeta, ko je uničen ali ko je skript prekinjen ali zaustavljen. Konstruktorji so člani posebnih funkcij za na novo ustvarjene primerke objekta. Destruktorji so ravno obratno konstruktorjem in jih pokličemo, ko ustvarjeni primerek izbrišemo iz pomnilnika.

Konstruktor pokliče funkcija __construct (), medtem ko se destruktor pokliče s pomočjo funkcije __destruct (), ki jo PHP samodejno pokliče na dnu skripta. Če na predmet v nobenem zaporedju ni nobene reference, se samodejno pokliče destruktor.

Osnovna skladnja za klicanje uničevalca: Funkcija __destruct (),

Sintaksa:

__destruct ( void ) : void

Če želite poklicati vsak destruktor, mora biti pred njim konstruktor, kot je prikazano spodaj:

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

Delo Destruktorja v PHP

Destruktor v bistvu upravlja zbiralnik smeti, ki predmet očisti, ko ga ne potrebujete več. Ne more vzeti nobenih argumentov kot svoj vložek v nasprotju s konstruktorjem.

Ta metoda se uporablja tudi za čiščenje virov in sprostitev pomnilnika za sprejem več. Preobremenitve z destruktorji ni mogoče izvajati in v istem razredu lahko obstaja samo en destruktor. Še ena njegova posebnost je, da bo destruktor še vedno poklical, tudi če je skript ustavil njegovo izvedbo s pomočjo ukaza exit (). Ta izhod () ne bo omogočil prekinitve ostankov.

Primeri Destruktorja v PHP

Vzemimo nekaj primerov za boljše razumevanje destruktorja:

Primer # 1

To je preprost primer, ko ustvarjamo osnovno funkcijo konstruktorja in jo nato s klicanjem funkcije destruktorja uničimo.

Koda:

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

Izhod:

Primer # 2

Za ta primer v konstruktorju uporabljamo dve spremenljivki; ime in priimek zaposlenega in nato uničujemo objekt Zaposleni tik preden se konča koda PHP s klicem uničevalca.

Koda:

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

Izhod:

Primer # 3

V tem primeru bomo videli, kako ravnati z datoteko test_doc.txt, ki je predpogoj besedilni dokument, ki mora biti v istem delovnem imeniku kot glavna datoteka. Prepričajte se, da je v test_doc.txt vključeno nekaj besedila, ki mora biti prikazano kot del kode.

fopen je vgrajena funkcija, ki se uporablja za odpiranje datoteke, fread pa je funkcija za branje vsebine datoteke. Tu se pokliče destruktor, da zapre / uniči datoteko.

Koda:

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

Izhod:

Kot je omenjeno v kodi, če v sredini skripta odvežemo funkcijo gc_collect_cycles (), dobimo izhod kot spodaj:

Primer št. 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();
?>

Izhod:

Če test_doc.txt ni ustvarjen, se sproži naslednje opozorilo.

Prednosti Destruktorjev

  • Destruktorji pomagajo sprostiti dodeljevanje pomnilnika, s čimer zagotovi, da je konstruktor prisoten potreben prostor za novo ustvarjene predmete ali sprosti vire za katero koli drugo nalogo.
  • Zagotavlja učinkovito izvajanje vseh nalog, saj skrbi za postopek čiščenja.
  • V primeru, da je dodeljenih veliko spremenljivk in struktur, bo uporaba destruktorjev preprečila uhajanje spomina s sproščanjem notranjih virov.
  • Skrbi tako za statične kot lokalne spremenljivke.

Omejitve uničevalcev

  • Destruktorji ne morejo sprejeti nobenih parametrov, prav tako ne dajejo nobene povratne vrednosti (niti neveljavne).
  • Dedovanje ni dovoljeno zaradi destruktorjev
  • Ni obvezno, da bo destruktor statičen
  • Sklicevanje na naslov uničevalnika ni mogoče
  • Predmet, ki spada v razred, ki vsebuje destruktor, ni dovoljen, da bi bil član zveze.
  • Obvezno mora imeti destruktorjev dostop do javnosti.

Zaključek

Kot smo videli, se destruktorji, ki so ravno obratni konstruktorjem, uporabljajo za uničenje predmeta po njegovi uporabi in niso potrebni v kodi. Tako zagotavlja, da očisti neželene vire, kar omogoča prostor za prihodnje vire. To stori z razglasitvijo funkcije __destruct (), ki jo PHP samodejno pokliče na koncu skripta.

Priporočeni članki

To je vodnik za Destructor v PHP. Tukaj obravnavamo delovanje, prednosti in omejitve destruktorja v PHP-ju skupaj s primeri. Če želite izvedeti več, si oglejte tudi naslednje članke -

  1. Pridružitveni niz v PHP
  2. Kvadratni koren v PHP
  3. Funkcije v PHP
  4. Pridobite IP naslov v PHP