PHP 5 permite programatorilor să definească constructori pentru clase. Clasele care au definit un constructor vor apela această metodă la fiecare obiect nou creat, pentru ca acesta (obiectul) să fie utilizabil pentru inițializare înante de a fi folosit.
Notă: Constructorul-părinte nu este apelat implicit dacă clasa-fiică definește un constructor. Pentru a apela un constructor-părinte, este necesar de a apela parent::__construct() din cadrul constructorului-fiu. Dacă clasa-fiică nu definește un constructor, atunci acesta poate fi moștenit de la clasa-părinte la fel ca o metodă normală a clasei (dacă aceasta nu a fost declarată ca privată).
Example #1 utilizarea noilor constructori unificați
<?php
class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "In SubClass constructor\n";
}
}
class OtherSubClass extends BaseClass {
// inherits BaseClass's constructor
}
// In BaseClass constructor
$obj = new BaseClass();
// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass();
// In BaseClass constructor
$obj = new OtherSubClass();
?>
Pentru compatibilitate cu PHP 3 și 4, dacă PHP nu poate găsi funcția __construct() pentru o clasă dată, și această funcție nu a fost moștenită de la clasa părinte, va fi căutată funcția constructor de stil vechi, cu numele clasei. Drept urmare, singurul caz care va duce la probleme de compatibilitate este dacă clasa a avut o metodă __construct() folosită cu alt scop semantic.
Constructorii de stil vechi sunt ÎNVECHIȚI în PHP 7.0 și vor fi eliminați într-o versiune ulterioară. Trebuie întotdeauna să utilizați __construct() în coduri-sursă noi.
Spre deosebire de alte metode, PHP nu va genera un mesaj de eroare de nivel
E_STRICT
atunci când __construct()
este suprascrisă cu alți parametri decât cei ai metodei
__construct() din clasa-părinte.
Începând cu PHP 5.3.3, metodele cu același nume ca și ultimul element al unei clase din spațiul de nume nu vor mai fi tratate ca constructor. Această schimbare nu afectează clasele fără spații de nume.
Example #2 Constructori în clasele cu spații de nume
<?php
namespace Foo;
class Bar {
public function Bar() {
// tratată ca constructor în PHP 5.3.0-5.3.2
// tratată ca o metodă obișnuită începând cu PHP 5.3.3
}
}
?>
PHP 5 introduce un concept de distrugere a unui obiect similar cu cel regăsit în alte limbaje de programare orientate pe obiecte (C++). Metoda de distrugere va fi apelată imediat ce nu mai sunt careva referințe către un anumit obiect sau în orice ordine în timpul secvenței de deconectare.
Example #3 Exemplu destructor
<?php
class ClassaCuDestructor {
function __construct() {
print "Sunt în constructor.\n";
$this->name = "ClassaCuDestructor";
}
function __destruct() {
print "Distrug " . $this->name . "\n";
}
}
$obj = new ClassaCuDestructor();
?>
La fel ca la constructori, destructorii-părinti nu vor fi apelați implicit. Pentru a apela destructorul-părinte trebuie să apelați explicit parent::__destruct() în destructorul descendent. De asemenea, ca și în cazul constructorilor, o clasă-fiică poate să moștenească destructorul părintelui dacă ea nu-și implementează destructorul propriu.
Destructorul este apelat chiar dacă scriptul este terminat cu apelul la funcția exit(). Apelând exit() într-un destructor va preveni apelarea tuturor rutinelor de terminare din scriptul respectiv.
Notă:
Destructorii apelați la momentul terminării execuției scriptului au antetele HTTP trimise deja. Directorul de lucru în timpul fazei de deconectare a scriptului poate să difere în cazul anumitor SAPI-uri (de ex. Apache).
Notă:
Încercarea de a arunca o excepție dintr-un destructor (apelat la momentul terminării execuției scriptului) va cauza o eroare fatală.