sono i due metodi magici più importanti di PHP
metodi:
- __construct(parametri) costruttore
quando si vuole creare un’istanza/oggetto della classe
a differenza degli altri linguaggi di programmazione non ha lo stesso nome della classe
la funzione viene utilizzata per far assumere comportamenti diversi agli oggetti, per esempio settando i valori delle proprietà passandoli come parametri
esempio: classe con costruttore per settare valore parametri senza controllo
class Classe
{
// proprietà
public $a = 10;
public $b = 20;
// costruttore
public function __construct($a, $b)
{
$this->a = $a;
$this->b = $b;
}
// metodi
public function sayHello()
{
echo "Hello! " . $this->a . " " . $this->b;
}
}
// creazione delle istanze
$myClass_1 = new Classe(40, 40);
$myClass_2 = new Classe("a", "b");
esempio: classe con costruttore con controlli sui parametri
class Classe
{
// proprietà
public $a = 10;
public $b = 20;
// costruttore con controllo
public function __construct($a, $b)
{
// gli argomenti devono essere interi
if(!is_int($a) || !is_int($b)) exit("gli argomenti devono essere interi!");
// gli argomenti devono essere minori di 100
if($a > 100 || $b > 100) exit("gli argomenti devono essere minori di 100!");
$this->a = $a;
$this->b = $b;
}
...
}
// creazione delle istanze
$myClass_1 = new Classe(40, 80); → ok
$myClass_2 = new Classe("a", "b"); → errore: "The arguments must be integers!"
- __destruct distruttore
quando di elimina l'oggetto
molto utile per chiudere gli handle dei files, le connessioni al database, o altre operazioni da eseguire prima che l’oggetto venga distrutto
PHP chiama il metodo distruttore solo quando per prima cosa tutti i riferimenti all’oggetto siano stati cancellati e:
- l’oggetto è distrutto/cancellato manualmente tramite comando unset
- settare esplicitamente l’oggetto ad un nuovo valore
- al termine dello script sicuramente in quanto tutti gli oggetti e eventuali riferimenti vengono distrutti
esempio:
class Classe
{
// proprietà
public $a = 10;
public $b = 20;
// costruttore
public function __construct($a, $b)
{
$this->a = $a;
$this->b = $b;
}
// distruttore
public function __destruct()
{
echo "__destruct metodo chiamato!";
}
}
// creazione delle istanze
$myClass_1 = new Classe("username", "password");
$myClass_2 = new Classe("username", "password");
$myClass_3 = new Classe("username", "password");
$myClass_4 = $myClass_3;
// distruzione delle istanze
unset($myClass_1); → stampa "__destruct metodo chiamato!" (cancellazione manuale)
$myClass_2 = 0; → stampa "__destruct metodo chiamato!" (settaggio nuovo valore)
unset($myClass_3); → non chiama il distruttore, esiste ancora un riferimento all'oggetto $myClass_3 ($myClass_4)