Wprowadzenie do Destructor w PHP

PHP wprowadziło metodę destruktora taką samą jak obecna w innych językach OOP, takich jak C ++. Jak sama nazwa wskazuje, destruktor oznacza znaczenie obiektu, gdy zostanie on zniszczony lub gdy skrypt zostanie przerwany lub zatrzymany. Konstruktory są członkami funkcji specjalnych dla nowo tworzonych instancji obiektów. Destruktory są dokładnym przeciwieństwem konstruktorów i są wywoływane, gdy utworzona instancja zostanie usunięta z pamięci.

Konstruktor jest wywoływany przez funkcję __construct (), natomiast destruktor jest wywoływany za pomocą funkcji __destruct (), którą PHP wywołuje automatycznie u dołu skryptu. Gdy w zasadzie nie ma żadnych odniesień do obiektu w dowolnej kolejności, automatycznie wywoływany jest destruktor.

Podstawowa składnia do wywołania destruktora: funkcja __destruct (),

Składnia:

__destruct ( void ) : void

Aby wywołać każdy destruktor, musi istnieć konstruktor, jak pokazano poniżej:

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

Praca Destructor w PHP

Destructor jest w zasadzie zarządzany przez Garbage Collector, który usuwa obiekt, gdy nie jest już potrzebny. Nie może przyjmować żadnych argumentów jako danych wejściowych w przeciwieństwie do konstruktora.

Ta metoda jest również używana do czyszczenia zasobów i do zwalniania pamięci, aby pomieścić więcej. Przeciążenia nie można wykonać za pomocą destruktorów, a tylko jeden destruktor może istnieć w tej samej klasie. Inną unikalną cechą jest to, że nawet jeśli skrypt zatrzymał wykonywanie za pomocą komendy exit (), destruktor nadal będzie wywoływany. To exit () nie pozwoli na opuszczenie pozostałych metod zamykania.

Przykłady Destructor w PHP

Weźmy kilka przykładów, aby lepiej zrozumieć destruktor:

Przykład 1

Jest to prosty przykład, w którym tworzymy podstawową funkcję konstruktora, a następnie niszczymy ją, wywołując funkcję destruktora.

Kod:

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

Wynik:

Przykład nr 2

W tym przykładzie używamy dwóch zmiennych w konstruktorze; imię i nazwisko pracownika, a następnie niszczymy obiekt Pracownik tuż przed zakończeniem kodu PHP przez wywołanie destruktora.

Kod:

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

Wynik:

Przykład nr 3

W tym przykładzie zobaczymy, jak obsługiwać plik test_doc.txt, który jest wstępnie wymaganym dokumentem tekstowym, który powinien znajdować się w tym samym katalogu roboczym, co plik główny. Pamiętaj o dołączeniu tekstu do pliku test_doc.txt, który musi zostać wyświetlony jako część kodu.

fopen to wbudowana funkcja używana do otwierania pliku, a fread to funkcja używana do odczytu zawartości pliku. Tutaj zostanie wywołany destruktor, aby zamknąć / zniszczyć uchwyt pliku.

Kod:

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

Wynik:

Jak wspomniano w kodzie, jeśli odkomentujemy funkcję gc_collect_cycles () w środku skryptu, otrzymamy wynik w następujący sposób:

Przykład 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();
?>

Wynik:

Jeśli test_doc.txt nie zostanie utworzone, zostanie wyświetlone następujące ostrzeżenie.

Zalety niszczycieli

  • Destruktory pomagają w zwolnieniu alokacji pamięci, zapewniając w ten sposób wymaganą przestrzeń dla nowo tworzonych obiektów przez konstruktora lub zwalniając zasoby na inne zadania.
  • Zapewnia, że ​​wszystkie zadania działają sprawnie, ponieważ zajmuje się procesem czyszczenia.
  • W przypadkach, w których przydzielonych jest wiele zmiennych i struktur, użycie destruktorów pomoże zapobiec wyciekom pamięci poprzez uwolnienie zasobów wewnętrznych.
  • Dba o zmienne statyczne i lokalne.

Ograniczenia niszczycieli

  • Niszczyciele nie mogą przyjmować żadnych parametrów, a także nie dają żadnej wartości zwrotnej (nawet nieważnej).
  • Dziedziczenie nie jest dozwolone przez destruktory
  • Niszczyciel nie musi być statyczny
  • Odwołanie się do adresu niszczyciela nie jest możliwe
  • Obiekt należący do klasy zawierającej destruktor nie może być członkiem związku.
  • Obowiązkowe jest, aby funkcja destruktora miała dostęp publiczny.

Wniosek

Jak widzieliśmy, destruktory będące dokładną odwrotnością konstruktorów są używane do niszczenia obiektu po jego użyciu i nie są wymagane w dalszej części kodu. Zapewniając w ten sposób, że usuwa niechciane zasoby, zapewniając miejsce na przyszłe zasoby. Odbywa się to poprzez zadeklarowanie funkcji __destruct (), która będzie wywoływana przez PHP automatycznie na końcu skryptu.

Polecane artykuły

To jest przewodnik po Destructor w PHP. Tutaj omawiamy działanie, zalety i ograniczenia destruktora w PHP wraz z przykładami. Możesz także przejrzeć następujące artykuły, aby dowiedzieć się więcej -

  1. Tablica asocjacyjna w PHP
  2. Pierwiastek kwadratowy w PHP
  3. Funkcje w PHP
  4. Uzyskaj adres IP w PHP