Úvod do Destructor v PHP

PHP zavedlo metodu destruktoru stejnou jako v jiných jazycích OOP, jako je C ++. Jak název napovídá, destruktor je význam objektu, když je zničen nebo když je skript přerušen nebo zastaven. Konstruktory jsou členy speciálních funkcí pro nově vytvořené instance objektu. Destruktory jsou přesným opakem konstruktorů a vyvolávají se, když je vytvořená instance odstraněna z paměti.

Konstruktor je volán funkcí __construct (), zatímco destruktor je volán pomocí funkce __destruct (), kterou PHP automaticky volá ve spodní části skriptu. Pokud v žádném pořadí v podstatě nezůstane žádný odkaz na objekt, automaticky se vyvolá destruktor.

Základní syntaxe pro vyvolání destruktoru: Funkce __destruct (),

Syntax:

__destruct ( void ) : void

Aby bylo možné volat každý destruktor, musí před ním být konstruktor, jak je uvedeno níže:

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

Práce Destructor v PHP

Destruktor je v zásadě spravován sběratelem odpadků, který vyčistí objekt, když už není potřeba. Na rozdíl od konstruktéra nemůže brát jako argumenty žádné argumenty.

Tato metoda se také používá k čištění zdrojů a uvolnění paměti pro další ubytování. Přetížení nelze provést s destruktory a ve stejné třídě může existovat pouze jeden destruktor. Jinou jedinečnou vlastností je, že i když skript zastavil jeho provádění pomocí příkazu exit (), destruktor bude stále vyvolán. Tento exit () neumožní ukončení metody ukončení.

Příklady Destructor v PHP

Vezměme si příklady, abychom lépe porozuměli destruktoru:

Příklad č. 1

Toto je jednoduchý příklad, kdy vytváříme základní konstrukční funkci a poté ji ničíme voláním destruktorové funkce.

Kód:

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

Výstup:

Příklad č. 2

V tomto příkladu používáme ve konstruktoru dvě proměnné; jméno a příjmení zaměstnance a potom ničíme objekt Zaměstnanec těsně před ukončením kódu PHP voláním destruktoru.

Kód:

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

Výstup:

Příklad č. 3

V tomto příkladu uvidíme, jak zacházet se souborem test_doc.txt, což je předepsaný textový dokument, který má být přítomen ve stejném pracovním adresáři jako hlavní soubor. Nezapomeňte do test_doc.txt vložit text, který musí být zobrazen jako součást kódu.

fopen je vestavěná funkce používaná k otevření souboru a fread je funkce používaná ke čtení obsahu souboru. Zde bude zavolán destruktor, aby zavřel / zničil filehandle.

Kód:

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

Výstup:

Jak je uvedeno v kódu, pokud zrušíme funkci gc_collect_cycles () ve středu skriptu, dostaneme výstup následujícím způsobem:

Příklad č. 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();
?>

Výstup:

Pokud není vytvořen test_doc.txt, je vyvoláno následující varování.

Výhody Destruktorů

  • Destruktory pomáhají při uvolňování alokace paměti, čímž zajišťují, že konstruktér má k dispozici požadované místo pro nově vytvořené objekty nebo uvolňuje zdroje pro jakýkoli jiný úkol.
  • Zajišťuje, aby všechny úkoly fungovaly efektivně, protože se stará o proces čištění.
  • V případech, kdy je přiděleno mnoho proměnných a struktur, pomůže použití destruktorů zabránit úniku paměti uvolněním interních zdrojů.
  • Postará se o statické i lokální proměnné.

Omezení ničitelů

  • Destruktory nemohou mít žádné parametry a také nedávají žádnou návratnou hodnotu (ani neplatnou).
  • Dědičnost není prostřednictvím destruktorů povolena
  • Není povinné, aby byl destruktor statický
  • Není možné odkazovat na adresu destruktoru
  • Objekt, který patří do třídy obsahující destruktor, nesmí být členem unie.
  • Je nutné, aby funkce destruktoru měla veřejný přístup.

Závěr

Jak jsme viděli, destruktory, které jsou přesným inverzemem konstruktérů, se používají ke zničení objektu po jeho použití a v kódu se dále nevyžadují. Zajistí tak, že vyčistí nežádoucí zdroje a poskytne tak prostor pro budoucí zdroje. To se provádí deklarováním funkce __destruct (), kterou PHP automaticky zavolá na konci skriptu.

Doporučené články

Toto je průvodce Destructorem v PHP. Zde diskutujeme práci, výhody a omezení destruktoru v PHP spolu s příklady. Další informace naleznete také v následujících článcích -

  1. Asociativní pole v PHP
  2. Square Root v PHP
  3. Funkce v PHP
  4. Získejte IP adresu v PHP

Kategorie: