Visibilità pubblica o privata della classe: PHP OOP senza segreti, quinta puntata

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

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo:
close-alt close collapse comment ellipsis expand gallery heart lock menu next pinned previous reply search share star