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().'
'
;
?>