1) Perchè utilizzare le proprietà statiche?
Un attributo statico è una variabile di classe che esiste a prescindere dal fatto che la classe sia stata istanziata o meno. Ciò permette di disporre di una certa informazione indipendentemente da una specifica istanza, accedendo direttamente tramite il nome della classe se l'attributo è pubblico.
Esempio
Codice PHP:
<?php
class cEsempio{
public static $var=100;
}
echo cEsempio::$var.'
';
cEsempio::$var+=20;
echo cEsempio::$var.'
';
?>
Ma è anche uno strumento di condivisione dell'informazione tra più istanze della stessa classe o sue discendenti. I metodi della classe e delle sue discendenti possono accedere all'informazione comune a tutte le istanze (oggetti) tramite il costrutto self.
In più si può avere un maggior controllo sul codice specificando un modificatore d'accesso. Ciò implica che
- un attributo public static è accessibile tramite il nome della classe anche fuori dei metodi definiti nella classe stessa;
- un attributo protected static è accessibile solo all'interno dei metodi della classe e dei suoi discendenti tramite il costrutto self;
- un attributo private static è accessibile solo dai metodi della classe tramite il costrutto self;
Sta di fatto che se intendi consentire l'accesso e la modifica di un attributo, sia pure static, è opportuno farlo tramite dei metodi di accesso e modifica (magari static anch'essi se non coinvolgono attributi e metodi non static) e definire l'attributo static come private static, per il principio di incapsulamento .
Altro esempio
Codice PHP:
<?php
class cEsempio{
private static $var=100;
private $interoA;
public function __construct($interoA=0){
$this->setInteroA($interoA);
}
public static function getVar(){
return self::$var;
}
public static function setVar($val){
if(is_int($val))
self::$var=$val;
else
return false;
return true;
}
public static function incVar($valInc){
if(is_int($valInc))
return self::setVar(self::getVar()+$valInc);
else
return false;
}
public function getInteroA(){
return $this->interoA;
}
public function setInteroA($val){
if(is_int($val))
$this->interoA=$val;
else
return false;
return true;
}
public function getInteroAPlusVar(){
return $this->getInteroA() + self::GetVar();
}
}
echo <<< 'EOT'
Creo due oggetti con intero al loro interno di 15 e 100
$objA = new cEsempio(15);
$objB = new cEsempio(100);
EOT;
$objA = new cEsempio(15);
$objB = new cEsempio(100);
echo 'cEsempio::GetVar() ritorna '.cEsempio::GetVar().'
';
echo '$objA->GetVar() ritorna '.$objA->GetVar().'
';
echo '$objB->GetVar() ritorna '.$objB->GetVar().'
';
echo '
Una istanza della classe modifica il contenuto condiviso con istruzione
$objA->IncVar(10);
';
$objA->IncVar(10);
echo 'cEsempio::GetVar() ritorna '.cEsempio::GetVar().'
';
echo '$objA->GetVar() ritorna '.$objA->GetVar().'
';
echo '$objB->GetVar() ritorna '.$objB->GetVar().'
';
echo '
Uso del dato condiviso dalle diverse classi istanziate
';
echo '$objA->getInteroAPlusVar() ritorna '.$objA->getInteroAPlusVar().'
';
echo '$objB->getInteroAPlusVar() ritorna '.$objB->getInteroAPlusVar().'
';
?>