All’ indirizzo https://umbriawaytarget.wordpress.com/2020/04/20/viverre-pericolosamente-con-oop-in-php-costruttori-e-distruttori-quarta-puntata/ abbiamo familiarizzato con i costruttori e i distruttori di una classe, ossia con delle modalità di inizializzazione per i nostri oggetti che possono anche avere un fine vita. A questo punto dedichiamoci a scandagliare il concetto di visibilità di una variabile all’ interno di una classe. C’è differenza se uso questi contenitori anteponendo la parola chiave private al posto di public? Certo che sì. Nel primo caso abbiamo una classe che si rende disponibile anche all’ esterno mentre con private stringiamo un pò di più la sicurezza consentendo l’accesso esterno al valore delle variabili solo se supportate con metodi idonei all’ interno della classe stessa. Per fare i nostri esperimenti ci avvaleremo come al solito del nostro server online http://phptester.net/. Scriviamo una classe Grande Maestro semplice con due sole proprietà, nome e cognome, sempre tra i tag di apertura e chiusura canonici che sono <?php e fine scripte cioé ?>:
class gm
{
public $nome;
public $cognome;
}
adesso vediamo l’effetto che fa istanziando una classe e stampando il valore di una proprietà:
$gm = new gm();
echo $gm->nome=”Fabiano”;
a video vedrò naturalmente la stringa Fabiano. Adesso vediamo cosa succede a video se introduco variabili con visibilità PRIVATE e modifico lo script in questo modo:
class gm
{
private $nome;
private $cognome;
}
$gm = new gm();
echo $gm->nome=”Fabiano”;
ed ecco il risultato ottenuto a video in questo caso:
FATAL ERROR Uncaught Error: Cannot access private property gm::$nome in /home4/phptest/public_html/code.php70(5) : eval()’d code:10 Stack trace: #0 /home4/phptest/public_html/code.php70(5): eval() #1 {main} thrown on line number 10
ossia il nostro parser ci dice che non ho accesso alla visibilità delle variabili definite dalla classe, per aggirare il problema devo per forza e necessariamente introdurre dei metodi di esportazione nella classe, funzioni di inizializzazione o di lettura, modifichiamo quindi lo script in questi termini:
class gm
{
private $nome;
private $cognome;
function __construct($c)
{
$this->cognome=$c;
}
function setNome($n)
{
$this->nome=$n;
}
function getCognome()
{
return $this->cognome;
}
}
$gm=new gm(“Caruana”);
$gm->setNome(“Fabiano”);
var_dump($gm);
echo “<br><br>”;
echo $gm->getCognome();
Sostanzialmente abbiamo un costruttore che inizializza il valore di cognome inserendo un argomento che in questo caso è il cognome, mentre abbiamo anche definito un metodo per settare-impostare la proprietà name e un altro metodo per farci restituire indietro il valore di ritorno dell’ argomento specificato in modo da poterlo stampare a video. A questo punto quello che vedrò correttamente a video sarà:
object(gm)#1 (2) { [“nome”:”gm”:private]=> string(7) “Fabiano” [“cognome”:”gm”:private]=> string(7) “Caruana” }
Caruana