Per offrirti un'esperienza di navigazione sempre migliore, questo sito utilizza cookie propri e di terze parti, partner selezionati. I cookie di terze parti potranno anche essere di profilazione.
Le tue preferenze si applicheranno solo a questo sito web. Puoi modificare le tue preferenze in qualsiasi momento ritornando su questo sito o consultando la nostra informativa sulla riservatezza.
E' possibile rivedere la nostra privacy policy cliccando qui e la nostra cookie policy cliccando qui.
Per modificare le impostazioni dei cookies clicca qui
  • seguici su feed rss
  • seguici su twitter
  • seguici su linkedin
  • seguici su facebook
  • cerca

SEI GIA' REGISTRATO? EFFETTUA ADESSO IL LOGIN.



ricordami per 365 giorni

HAI DIMENTICATO LA PASSWORD? CLICCA QUI

NON SEI ANCORA REGISTRATO ? CLICCA QUI E REGISTRATI !

Le proprietà e i metodi STATICI in PHP

di :: 17 novembre 2022
Le proprietà e i metodi STATICI in PHP

Dopo aver introdotto le classi in PHP, e quindi dopo aver appreso cosa sono le proprietà e i metodi, oggi ci occupiamo delle proprietà e dei metodi STATICI di una classe.

Sono elementi non accessibili tramite tramite l'istanza della classe, bensì sono elementi interni alla classe stessa.

Ad esempio, creiamo una classe con due proprietà, una public "anni" che rendiamo anche "statica", una protected "nome", ed un metodo "getName" public che restituirà il valore della proprietà "nome".

Istanziamo quindi un oggetto della classe H e proviamo ad accedere alla proprietà "anni" come faremmo normalmente.

<?php

class H{
	protected $nome="Giulio";
	public static $anni=14;

	public function getName()
	{
		return $this->nome;
	}
}

$obj=new H;
echo $obj->anni;
?>

Questo script non renderà nulla perchè, per accedere alle proprietà statiche, non possiamo avvalerci dell'oggetto "$obj->anni", ma dobbiamo usare una sintassi differente: "H::$anni".

Correggiamo quindi lo script

<?php

class H{
	protected $nome="Giulio";
	public static $anni=14;

	public function getName()
	{
		return $this->nome;
	}
}

$obj=new H;
echo H::$anni;
?>

Questo script resituirà il numero 14.

Adesso rendiamo statica anche l'altra proprietà "nome", che è utilizzata nel metodo getName.

Quindi istanziamo un oggetto di classe H e poi accediamo al metodo "getName"

<?php

class H{
	protected static $nome="Giulio";
	public static $anni=14;

	public function getName()
	{
		return $this->nome;
	}
}

$obj=new H;
echo $obj->getName();

?>

Anche in questo caso non avremo una risposta dal metodo, perchè per utilizzare una proprietà statica, dentro al metodo, devi usare una sintassi differente che utilizza la parola chiave "self::" e non "this->"

<?php

class H{
	protected static $nome="Giulio";
	public static $anni=14;

	public function getName()
	{
		return self::$nome;
	}
}

$obj=new H;
echo $obj->getName();

?>

Il metodo restituirà "Giulio".

Con questo nuovo esempio capiamo ancora meglio la differenza tra una proprietà normale ed una proprietà statica.

In questo esempio abbiamo una proprietà normale, anni, che vale 14 ed all'interno della classe abbiamo un metodo costruttore, cioè un metodo che verrà richiamato ogni volta che istanzio la classe, e che incrementa di uno il valore di anni.

<?php

class H{
     public $anni=14;
      
     public function __construct(){
        $this->anni++;
     }
}

$obj=new H;
echo $obj->anni;

$obj=new H;
echo $obj->anni;
?>

Provate ad istanziare due volte la classe. Ci aspettiamo che entrambi gli echo rendano il numero 15, ed effettivamente è così.

Adesso modifichiamo l'esempio, utilizzando una proprietà statica.

<?php

class H{
     public static $anni=14;
      
     public function __construct(){
        self::$anni++;
     }
}

$obj=new H;
echo H::$anni;

$obj=new H;
echo H::$anni;
?>

Istanziando due volte la classe, il primo echo rende il numero 15 ed  il secondo il numero 16... e non 15 come ci aspettavamo.

Ecco la differenza rispetto alle proprietà non statiche: le proprietà statiche (e i metodi statici) sono associate alla classe e non all'istanza della classe.

Procediamo con altri esempi.

Complichiamoci la vita, creando una classe CHILD (figlia): per accedere da questa classe, ad una proprietà o metodo statico della classe parent dobbiamo utilizzare la parola chiave "parent"

<?php

class H{
	protected static $nome="Giulio";
	public static $anni=14;

	public function getName()
	{
		return self::$nome;
	}
}

class I extends H{
	public function test()
	{
		return parent::$nome;
	}
}

$obj=new I;
echo $obj->nome;
?>

Abbiamo istanziato un oggetto della classe "I" e successivamente abbiamo avuto accesso alla proprietà "nome".

Per i metodi vale la stessa cosa, ad esempio dichiariamo statico il metodo "test".

<?php

class H{
	protected static $nome="Giulio";
	public static $anni=14;

	public function getName()
	{
		return self::$nome;
	}
}

class I extends H{
	public static function test()
	{
		return parent::$nome;
	}
}

$obj=new I;
echo I::test();
?>

Per accedere al metodo, adesso statico, "test", abbiamo utilizzare la sintassi "I::test()".

Un paio di note finali.

La prima: questi "::" (due punti) vengono chiamati SCOPE RESOLUTION OPERATOR.

La seconda: esiste un'altra sintassi che prevede la definizione di una variabile che ha, come valore, in nome della classe stessa.

Ad esempio setto la variabile "x" con il valore "I" della classe, e poi utilizzo la variabile al posto del nome della classe, così

$x="I";
$x::test();

Questo può essere utile se nello script richiamiamo molte volte la stessa classe  e se la classe avesse un nome lungo. In questo modo semplifichiamo il codice.

Potrebbe interessarti

 
 
 
 
pay per script

Hai bisogno di uno script PHP personalizzato, di una particolare configurazione su Linux, di una gestione dei tuoi server Linux, o di una consulenza per il tuo progetto?

x

ATTENZIONE