OOP e PHP decima puntata: dare visibilità a una classe derivata attingendo a classi madre definite come PRIVATE

web developer Umbria

Nella nona puntata di viaggio al centro di OOP https://umbriawayvendita.wordpress.com/2020/04/23/un-gm-e-un-essere-umano-se-si-puoi-estendere-la-classe-umano-e-farla-ereditare-alla-classe-gm-leredita-in-php-object-oriented-programming/ abbiamo visto che se ho una classe che ospita membri pubblici (variabili o proprietà dichiarate con la parola chiave public) posso estendere tutto il contenuto di quella classe con la parola chiave extends a una classe derivata e attingere a tutto il contenuto della classe madre senza dover inventare cose che sono già state definite. Questo nel caso di dichiarazioni di membri definiti come PUBLIC. Ma che succede se la classe madre ha dei contenuti protetti con PRIVATE? Serviamoci come al solito di http://phptester.net/ per sperimentare l’effetto che fa, copiando il nostro codice all’ interno dei tag <?php e fine tag ?>:

class Umano
{
private $nome;
private $cognome;

private function inizializza($n, $c)
{
$this->nome=$n;
$this->cognome=$c;
}
}

class Gm extends Umano
{
public $elo;
}

$gm=new Gm();

$gm->nome=”Fabiano”;
$gm->cognome=”Caruana”;

$gm->elo=2973;

//$gm->inizializza(“Fabiano”, “Caruana”);

var_dump($gm);

praticamente sto cercando di accedere esternamente in un contenuto protetto che cosa vedrò a video? Un messaggio illuminante che nella riga indicata da $gm->inizializza(“Fabiano”, “Caruana”); parla chiaro: non posso accedere al metodo dichiarato privato!

FATAL ERROR Uncaught Error: Call to private method Umano::inizializza() from context ” in /home4/phptest/public_html/code.php70(5) : eval()’d code:27 Stack trace: #0 /home4/phptest/public_html/code.php70(5): eval() #1 {main} thrown on line number 27

Come faccio quindi a risolvere l’arcano ossia ad entrare dentro ai metodi e ai membri della classe madre? Decommentiamo la funzione inizializza e scommentiamo le righe precedenti commentate, lo script diventa:

class Umano
{
private $nome;
private $cognome;

private function inizializza($n, $c)
{
$this->nome=$n;
$this->cognome=$c;
}
}

class Gm extends Umano
{
public $elo;
}

$gm=new Gm();

$gm->nome=”Fabiano”;
$gm->cognome=”Caruana”;

$gm->elo=2973;

//$gm->inizializza(“Fabiano”, “Caruana”);

var_dump($gm);

E a questo punto che cosa ottengo? A video comparirà magicamente una soluzione parziale, ossia vedrò correttamente la stampa dei dati:

object(Gm)#1 (5) { [“elo”]=> int(2973) [“nome”:”Umano”:private]=> NULL [“cognome”:”Umano”:private]=> NULL [“nome”]=> string(7) “Fabiano” [“cognome”]=> string(7) “Caruana” }

posso anche stampare i valori di nome e cognome modificando la parte finale di invocazione dello script esterna alle classi con:

class Umano
{
private $nome;
private $cognome;

private function inizializza($n, $c)
{
$this->nome=$n;
$this->cognome=$c;
}
}

class Gm extends Umano
{
public $elo;
}

$gm=new Gm();

echo “<br>”;
echo $gm->nome=”Fabiano”;
echo “<br>”;
echo $gm->cognome=”Caruana”;
echo “<br><br>”;

$gm->elo=2973;

//$gm->inizializza(“Fabiano”, “Caruana”);

var_dump($gm);

a Questo punto avrò ottenuto il seguente risultato in questa decima puntata che risponde al problema che ci siamo imposti di risolvere all’ inizio e cioé quello di attingere a metodi privati estendendo una classe:

Fabiano
Caruana

object(Gm)#1 (5) { [“elo”]=> int(2973) [“nome”:”Umano”:private]=> NULL [“cognome”:”Umano”:private]=> NULL [“nome”]=> string(7) “Fabiano” [“cognome”]=> string(7) “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...