Come accedere a proprietà e metodi statici da una sottoclasse - OOP in PHP

Come accedere a proprietà e metodi statici da una sottoclasse - OOP in PHP

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.";
    }
}
?>

Scritto da Donato Pirolo

Ciao, sono Donato, frontend developer con una smisurata passione per la SEO. Creo strumenti ad hoc per aiutare aziende e professionisti ad essere cercati sul web e trovare clienti.

Potrebbero interessarti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Copyright © 2023
linkedin facebook pinterest youtube rss twitter instagram facebook-blank rss-blank linkedin-blank pinterest youtube twitter instagram