Introductie tot Destructor in PHP

PHP heeft een destructormethode geïntroduceerd die dezelfde is als die in andere OOP-talen zoals C ++. Zoals de naam al aangeeft, is een destructor de betekenis van een object wanneer het wordt vernietigd of wanneer het script wordt onderbroken of gestopt. Constructors zijn leden van speciale functies voor de objectinstanties die nieuw zijn gemaakt. Destructors zijn precies het tegenovergestelde van constructors en worden aangeroepen wanneer de gemaakte instantie uit het geheugen wordt verwijderd.

Een constructor wordt aangeroepen door de functie __construct (), terwijl een destructor wordt aangeroepen met de functie __destruct () die de PHP automatisch aan de onderkant van het script aanroept. Wanneer er in principe geen enkele verwijzing naar een object in een willekeurige volgorde is, wordt automatisch een destructor aangeroepen.

Basissyntaxis om een ​​destructor aan te roepen: de functie __destruct (),

Syntaxis:

__destruct ( void ) : void

Voor elke destructor die moet worden aangeroepen, moet er een constructor voor zijn, zoals hieronder wordt weergegeven:

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

Werken van Destructor in PHP

Destructor wordt in principe beheerd door de Garbage Collector die een object wist wanneer het niet meer nodig is. Het kan geen argumenten als input gebruiken in tegenstelling tot de constructor.

Deze methode wordt ook gebruikt voor het opschonen van bronnen en om geheugen vrij te maken voor meer ruimte. Overbelasting kan niet worden uitgevoerd met destructors en slechts één destructor kan in dezelfde klasse bestaan. Een ander uniek kenmerk ervan is dat zelfs als het script de uitvoering is gestopt met behulp van een exit () -opdracht, de destructor nog steeds wordt aangeroepen. Met deze exit () kunnen de overgebleven afsluitmethoden niet worden afgesloten.

Voorbeelden van Destructor in PHP

Laten we enkele voorbeelden nemen om destructor beter te begrijpen:

Voorbeeld 1

Dit is een eenvoudig voorbeeld waarbij we een basisconstructorfunctie maken en deze vervolgens vernietigen door de destructorfunctie aan te roepen.

Code:

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

Output:

Voorbeeld 2

Voor dit voorbeeld gebruiken we twee variabelen in de constructor; werknemer voornaam en achternaam en dan vernietigen we het object Werknemer net voordat de PHP-code eindigt door de vernietiger te bellen.

Code:

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

Output:

Voorbeeld 3

In dit voorbeeld zullen we zien hoe om te gaan met een bestand test_doc.txt, een vereiste tekstdocument dat aanwezig moet zijn in dezelfde werkmap als het hoofdbestand. Zorg ervoor dat u wat tekst opneemt in de test_doc.txt die moet worden weergegeven als onderdeel van de code.

fopen is de ingebouwde functie die wordt gebruikt voor het openen van het bestand en fread is de functie die wordt gebruikt om de inhoud van het bestand te lezen. Hier wordt de destructor opgeroepen om de filehandle te sluiten / vernietigen.

Code:

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

Output:

Zoals vermeld in de code, krijgen we de uitvoer als volgt als we de functie gc_collect_cycles () in het midden van het script uitschakelen.

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

Output:

De volgende waarschuwing wordt gegenereerd als test_doc.txt niet is gemaakt.

Voordelen van destructors

  • Destructors helpen bij het vrijmaken van geheugentoewijzing waardoor de benodigde ruimte aanwezig is voor nieuw gemaakte objecten door de constructor of middelen vrijmaken voor een andere taak.
  • Zorgt ervoor dat alle taken efficiënt worden uitgevoerd, aangezien het voor het opruimproces zorgt.
  • In gevallen waarin veel variabelen en structuren worden toegewezen, helpt het gebruik van destructors om geheugenlekken te voorkomen door interne bronnen vrij te maken.
  • Het zorgt voor zowel statische als lokale variabelen.

Beperkingen van vernietigers

  • Destructors kunnen geen parameters aannemen en geven ook geen retourwaarde (zelfs niet ongeldig).
  • Overerving is niet toegestaan ​​via destructors
  • Het is niet verplicht dat een destructor statisch is
  • Verwijzen naar een adres van een destructor is niet mogelijk
  • Een object dat behoort tot de klasse die de vernietiger bevat, mag geen lid van de vakbond zijn.
  • Het is verplicht dat een destructorfunctie openbare toegang moet hebben.

Conclusie

Zoals we zagen, worden destructors die precies het omgekeerde zijn van constructors gebruikt om een ​​object te vernietigen nadat het gebruik ervan is voltooid en niet verder in de code is vereist. Dit zorgt ervoor dat ongewenste bronnen worden opgeruimd en ruimte wordt vrijgemaakt voor toekomstige bronnen. Dit wordt gedaan door de functie __destruct () aan te geven die automatisch door PHP aan het einde van het script wordt aangeroepen.

Aanbevolen artikelen

Dit is een gids voor Destructor in PHP. Hier bespreken we de werking, voordelen en beperkingen van destructor in PHP samen met voorbeelden. U kunt ook de volgende artikelen bekijken voor meer informatie -

  1. Associatieve Array in PHP
  2. Vierkantswortel in PHP
  3. Functies in PHP
  4. Krijg IP-adres in PHP