Viverre pericolosamente con OOP in PHP, costruttori e distruttori, quarta puntata

All’ indirizzo https://umbriawayvalorizza.wordpress.com/2020/04/20/vivere-pericolosamente-con-le-classi-php-terza-puntata/ abbiamo visto come implementare METODI all’ interno di una CLASSE. A questo punto non ci resta che approfondire un importante concetto, quello del COSTRUTTORE. Prendiamo in esame questa classe:

class gm
{
public $nome;
public $cognome;
public $elo;
}

$gm=new gm();
$gm->nome=”Fabiano”;
$gm->cognome=”Caruana”;
$gm->elo=2999;

che cosa succede quando scrivo $gm=new gm(); fuori dal blocco per istanziare l’oggetto fisico figlio della classe? E’ come se ordinassi di creare qualcosa che poi alloggerà in memoria, di fatto sto costruendo dal nulla un oggetto. Ma allora se posso far nascere un oggetto posso anche inizializzare la classe con un costruttore che anzichè farmi richiamare la funzione manualmente come accadeva negli esempi presenti in https://umbriawayvalorizza.wordpress.com/2020/04/20/vivere-pericolosamente-con-le-classi-php-terza-puntata/ mi carica direttamente delle istruzioni e mi inizializza l’oggetto secondo le mie modalità?

Vediamo questo esempio aggiungendo del codice sempre in http://phptester.net/:

class gm
{
public $nome;
public $cognome;
public $elo;

function __construct($n, $c, $e)
{
echo “ORA nasce l’oggetto GM”;
$this->nome=$n;
$this->cognome=$c;
$this->eta=$e;
}
}

//qui siamo usciti dalla classe e istanziamo l’oggetto

$gm=new gm(“Michele”, “Godena”, 2500);

var_dump($gm);

qui applico il metodo costruttore function __construct che assegna i valori iniziali con le proprietà dell’ oggetto, dopodichè contrariamente a quello che succedeva negli esempi precedenti qui siamo in grado di EVOCARE le proprietà della classe semplicemente istanziando l’oggetto con la parola chiave NEW che inietta nell’ output le nostre priorità di visualizzazione in maniera del tutto automatica, senza richiamare nessun nome di funzione. A questo punto il programmatore talentuoso potrà fare la domanda “ma se esiste un metodo costruttore esiste anche un metodo distruttore?”. Certamente vediamo un esempio:

class gm
{
public $nome;
public $cognome;
public $eta;

function __construct($n, $c, $e)
{
echo “ORA nasce l’oggetto $n $c <br>”;
$this->nome=$n;
$this->cognome=$c;
$this->elo=$e;
}

function __destruct()
{
echo “*** $this->nome $this->cognome viene distrutto *** <br>”;
}

}

$gm=new gm(“Fabiano”, “Caruana”, 1987);

var_dump($gm);

La funzione costruttore accetta tre parametri in ingresso. Che cosa vedrò a video dopo aver inizializzato un nuovo oggetto che questa volta ha anche il metodo __destruct() incluso nella classe?

ORA nasce l’oggetto Fabiano Caruana
object(gm)#1 (4) { [“nome”]=> string(7) “Fabiano” [“cognome”]=> string(7) “Caruana” [“eta”]=> NULL [“elo”]=> int(1987) }
*** Fabiano Caruana viene distrutto ***

Sostanzialmente prima viene creato e inizializzato l’oggetto, poi eseguo il metodo var_dump() per vedere il tipo di dati presenti nell’ oggetto $gm dopodichè il costruttore finita la sua missione deve lasciare il posto al distruttore che non fa altro che eliminare dalla memoria l’oggetto.

PHP, OOP, magic method e costruttori

Articoli precedenti su tema OOP:

https://umbriawayinfo.wordpress.com/2019/04/07/programmazione-procedurale-oppure-oop-this-is-the-problem/

https://umbriawaypotenzia.wordpress.com/2019/04/07/php-versione-sette-introdotte-nuove-direttive-per-trasformare-il-linguaggio-in-fortemente-tipicizzato/

https://umbriawaysemplifica.wordpress.com/2019/04/08/ambito-di-visibilita-delle-variabili-in-php-public-protected-private/

web developer umbriaVediamo adesso esempi visti negli articoli precedenti dove è palese che la definizione delle proprietà viene richiesta all’ utente ma che fare quando vogliamo ottenere un oggetto compiuto che abbia al suo interno già le proprietà inizializzate e definite con dei valori senza dover accedere all’interno della classe e settare queste variabili? Si ricorre ai metodi magici di PHP che iniziano con __ (due volte underscore) in questo caso scomodiamo il metodo COSTRUTTORE. Senza il costruttore dobbiamo andare noi a definire i valori delle proprietà di volta in volta, con quelle ambiguità legate alla visibilità delle variabili che possono indurci all’ errore senza l’uso della parola chiave THIS che fa riferimento all’ oggetto corrente quando non abbiamo a che fare con PUBLIC:

/*
<?php
class Libro {
public $titolo;
public $autore;
public $codiceisbn;
public $prezzo;
public $quantita;

}

output indirizzo: https://www.farwebdesign.com/PHPOOP/9/index.php

<?php
require_once “classi/Libro.php”;

$nlibro = new Libro();
var_dump($nlibro);
$nlibro->titolo = ‘Sandokan’;
$nlibro->autore = ‘Salgari’;
$nlibro->codiceisbn = ‘123ASWE’;
$nlibro->qta = 10;
echo “<br>”;
var_dump($nlibro);

*/

mentre con il costruttore caratterizzata dalla sintassi public function __construct($tit,$aut,$cod,$qta=1) ci accingiamo a creare un oggetto completo che ha le sue proprietà inizializzate e definite, senza dover intervenire in corsa:

/*

<?php
class Libro {
public $titolo;
public $autore;
public $codiceisbn;
public $prezzo;
public $quantita;
public function __construct($tit,$aut,$cod,$qta=1) {
$this-> titolo = $tit;
$this-> autore = $aut;
$this-> codiceisbn = $cod;
$this-> quantita = $qta;
}
public function getTitolo() {
return $this->titolo;
}
}

output con index1.php indirizzo https://www.farwebdesign.com/PHPOOP/9/index1.php, da notare il Sandokan finale dovuto alla stampa dell’ istruzione:
echo $nlibro->getTitolo();

<?php
require_once “classi/Libro1.php”;

$nlibro = new Libro(‘Sandokan’,’Salgari’, ‘1234ASB’);
var_dump($nlibro); //il var_dump è una funzione che stampa il tipo di dati
echo “<br>”;
echo $nlibro->getTitolo();

*/

Con new creiamo una istanza della classe, ma questo sistema non ci fa inizalizzare tutte le proprietà del nostro oggetto e i valori delle variabili devono venire precisati dopo, mentre con l’introduzione del costruttore creo un oggetto già personalizzato sulla base dei parametri che gli vado a passare. Dopo la parola NEW, il metodo costruttore forgia il nostro oggetto inserendo dei valori, ne consegue che questo metodo NON PUO’ RESTITUIRE DEI VALORI perchè non fa altro che dare forma compiuta al nostro oggetto con dei valori assegnati alle proprietà. Il costruttore che è la prima funzione che viene richiamata in una classe inizializza tutte le nostre variabili in una sola stringa. A questo punto non ci resta che perfezionare la nostra classe libro anche in ambito sicurezza, ciò verrà affrontato in una delle prossime puntate!

Blog su WordPress.com.

Su ↑