Constructori și destructori
Constructorii reprezintă metode speciale care se execută la crearea unui obiect și servesc pentru inițializarea inițială a proprietăților acestuia. Pentru a crea un constructor, trebuie să declarăm o funcție cu numele __construct (cu două liniuțe de subliniere înainte):
<?php
class Person
{
public $name, $age;
function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
function displayInfo()
{
echo "Name: $this->name; Age: $this->age<br>";
}
}
$tom = new Person("Tom", 36);
$tom -> displayInfo();
$bob = new Person("Bob", 41);
$bob -> displayInfo();
?>
Funcția constructorului, în acest caz, acceptă doi parametri. Valorile lor sunt transmise proprietăților clasei. Și acum, pentru a crea un obiect, trebuie să transmitem valori pentru parametrii corespunzători:
$tom = new Person("Tom", 36);
Rezultatul în browser:
Name: Tom; Age: 36
Name: Bob; Age: 41
Parametri impliciți
Pentru a face constructorul mai flexibil, putem desemna unul sau mai mulți parametri ca opționali. Astfel, la crearea unui obiect, nu este obligatoriu să specificăm toți parametrii. De exemplu, modificăm constructorul astfel:
function __construct($name="Tom", $age=36)
{
$this->name = $name;
$this->age = $age;
}
Astfel, dacă nu sunt specificați parametrii, vor fi utilizate valorile "Tom" și 36. Și acum putem crea un obiect Person în mai multe moduri:
<?php
class Person
{
public $name, $age;
function __construct($name="Tom", $age=36)
{
$this->name = $name;
$this->age = $age;
}
function displayInfo()
{
echo "Name: $this->name; Age: $this->age<br>";
}
}
$tom = new Person();
$tom -> displayInfo();
$bob = new Person("Bob");
$bob -> displayInfo();
$sam = new Person("Sam", 29);
$sam -> displayInfo();
?>
Rezultatul în browser:
Name: Tom; Age: 36
Name: Bob; Age: 36
Name: Sam; Age: 29
Declararea proprietăților prin constructor
Începând cu versiunea PHP 8, limbajul permite definirea proprietăților prin lista de parametri ai constructorului. Orice parametru al constructorului care are un modificator de acces, de exemplu, public, va reprezenta automat o nouă proprietate.
De exemplu, definim proprietățile name și age direct prin parametrii constructorului:
<?php
class Person
{
function __construct(public $name, public $age)
{
$this->name = $name;
$this->age = $age;
}
function displayInfo()
{
echo "Name: $this->name; Age: $this->age<br>";
}
}
$tom = new Person("Tom", 36);
$tom -> displayInfo();
?>
Deși, în acest caz, clasa nu definește explicit proprietățile name și age, deoarece în lista de parametri ai constructorului sunt specificați parametri cu aceste nume și cu modificator de acces (în acest caz public), clasa va crea automat aceste variabile.
Putem combina ambele metode de declarare a variabilelor:
<?php
class Person
{
public $name;
function __construct($name, public $age)
{
$this->name = $name;
$this->age = $age;
}
function displayInfo()
{
echo "Name: $this->name; Age: $this->age<br>";
}
}
La o astfel de declarare a proprietăților, putem transmite și valori implicite:
<?php
class Person
{
public $name;
function __construct($name = "Sam", public $age = 33)
{
$this->name = $name;
$this->age = $age;
}
function displayInfo()
{
echo "Name: $this->name; Age: $this->age<br>";
}
}
Destructori
Destructorii servesc pentru eliberarea resurselor utilizate de program - pentru eliberarea fișierelor deschise, conexiunilor deschise la baze de date etc. Destructorul unui obiect este apelat de către interpretul PHP după ce ultima referință la acel obiect este pierdută în program.
Destructorul este definit folosind funcția __destruct (două liniuțe de subliniere înainte):
<?php
class Person
{
public $name, $age;
function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
function getInfo()
{
echo "Name: $this->name; Age: $this->age <br>";
}
function __destruct()
{
echo "Apelare destructor";
}
}
Funcția destructorului este definită fără parametri, iar când obiectul nu mai are referințe în program, acesta va fi distrus și va fi apelat destructorul.