Come accedere a proprietà e metodi statici da una sottoclasse - OOP in PHP
Indice
Come abbiamo visto, le proprietà e i metodi statici sono elementi delle classi a cui si può accedere senza la necessità di creare un'istanza della classe. Ma come possiamo accedere ad una proprietà o ad un metodo da una sottoclasse?
Se per invocare una proprietà o un metodo interno ad una stessa classe usiamo la keyword self:: per invocare una proprietà o un metodo da una sottoclasse, possiamo usare la keyword static::
Sintassi per accedere a proprietà e metodi statici da una sottoclasse
class ClasseGenitore
{
public static $proprietaStatica = "Hello, World!";
public static function metodo(){
echo static::$proprietaStatica;
}
}
class ClasseFiglio extends ClasseGenitore
{
public static $proprietaStatica = "Ciao, Mondo";
}
ClasseFiglio::metodo();
In questo esempio abbiamo creato due classi : Una classe ClasseGenitore ed una classe ClasseFiglio che estende la classe ClasseGenitore.
All'interno della ClasseGenitore è contenuto la proprietà statica $proprietàStatica che è uguale a quella della classe figlio.
All'interno della ClasseGenitore è contenuto un metodo che stampa la $proprietaStatica.
Se invochiamo il metodo della classe genitore dalla classe figlio, essa ci restituisce la proprietà della classe figlio, grazie alla keyword static, infatti se avessimo utilizzato la keyword self:: , ci avrebbe stampato la proprietà della classe genitore.
Questo concetto si chiama : Late Static Bindings ..
Con il Late Static Bindings in PHP permette la risoluzione dinamica dei metodi e delle proprietà di una classe in base al tipo reale dell'oggetto a cui ci si riferisce, anziché in base al tipo dichiarato della variabile di oggetto.
Esempio di come accedere a proprietà e metodi statici da sottoclassi
/accesso-proprieta-metodi-statici-sottoclassi.php
<?php
// Importiamo le classi Genitore e Figlio
require __DIR__ . '/lib/genitorestatico.php';
require __DIR__ . '/lib/figliostatico.php';
// Stampiamo proprietà e metodi STATICI della classe GenitoreStatico (senza creare oggetti)
echo GenitoreStatico::$genProprieta . "\n";
echo GenitoreStatico::$proprietaGenerale . "\n";
echo GenitoreStatico::genMetodo1(). "\n";
// Stampiamo proprietà e metodi STATICI della classe FiglioStatico (senza creare oggetti)
echo FiglioStatico::$figProprieta . "\n";
echo FiglioStatico::$proprietaGenerale . "\n";
echo FiglioStatico::figMetodo1(). "\n";
// Stampiamo proprietà e metodi della Classe Genitore invocando la clase Figlio (ereditarietà)
echo FiglioStatico::$genProprieta . "\n";
echo FiglioStatico::genMetodo1(). "\n";
/* Stampiamo il metodo contenuto all'interno della classe Genitore (per ereditarierà), che contiene
due comandi di stampa per una proprietà contenuta sia nella classe genitore che nella classe figlio.
con self:: andremo a stampare la proprietà della classe corrente (Genitore)
con static:: andremo a stampare la proprietà della classe Figlio
*/
FiglioStatico::metodoGenerale() . "\n";
?>
/* OUTPUT:
Questa è la proprietà Genitore
Questa Proprietà appartiene alla classe Genitore
Questa è la proprietà Genitore integrata nel metodo GenitoreStatico::genMetodo1 genitore.
Questa è la proprietà Figlio
Questa Proprietà appartiene alla classe Figlio
Questa è la proprietà Figlio integrata nel metodo FiglioStatico::figMetodo1 figlio.
Questa è la proprietà Genitore
Questa è la proprietà Genitore integrata nel metodo GenitoreStatico::genMetodo1 genitore.
Questa Proprietà appartiene alla classe Genitore
Questa Proprietà appartiene alla classe Figlio
*/
/lib/genitorestatico.php
<?php
class GenitoreStatico
{
public static string $genProprieta = "Questa è la proprietà Genitore";
public static string $proprietaGenerale = "Questa Proprietà appartiene alla classe Genitore";
public static function genMetodo1(){
echo self::$genProprieta . " integrata nel metodo " . __METHOD__ . " genitore.";
}
public static function metodoGenerale() {
echo self::$proprietaGenerale . "\n";
echo static::$proprietaGenerale . "\n";
}
}
?>
/lib/figliostatico.php
<?php
class FiglioStatico extends GenitoreStatico
{
public static string $figProprieta = "Questa è la proprietà Figlio";
public static string $proprietaGenerale = "Questa Proprietà appartiene alla classe Figlio";
public static function figMetodo1(){
echo self::$figProprieta . " integrata nel metodo " . __METHOD__ . " figlio.";
}
}
?>