Ecco qualche esempio chiarificatore
Ho preso spunto da questa pagina:
http://www.html.it/pag/18348/i-metodi-statici/ aggiungendo dei dai per analizzare i vari casi in cui è possibile utilizzare l’operatore di risoluzione dell’ambito (“::”);
- con i dati dinamici (proprietà e metodi) occorre utilizzare la pseudo variabile $this per riferirsi agli elementi dall’interno della classe, mentre si deve utilizzare il namespace dell’istanza per riferirsi dall’esterno. L’operatore da utilizzare in entrambi i casi è l’operatore di deferenziamento (“->”)
- con i dati statici (costanti, proprietà statiche e metodi statici) occorre utilizzare l’operatore di risoluzione dell’ambito (“::”) unito al nome della classe che li contiene oppure alla keyword self
Ho preparato un esempio sempre partendo da quello proposto nella pagina indicata:
PHP:
<?php
class MyClass {
// proprietà statiche
static $miavar = 10;
//costante di classe
const ROSSO = "Rosso";
// metodi statici
public static function sayHello() {
echo "Hello!";
}
//in questo caso self viene utilizzato "all'interno della classe" per indicare la classe stessa, in sostituzione cioè di "MyClass". Avrei potuto scrivere MyClass::sayHello(); ma per comodità scrivo self::sayHello();
public static function sayHelloAgain() {
self::sayHello();
echo " Again!";
}
}
// stampa proprietà statiche
//stampa "10"
echo MyClass::$miavar;
// stampa costante di classe
//stampa "Rosso"
echo MyClass::ROSSO;
// stampa metodi statici
// stampa "Hello!"
MyClass::sayHello();
// stampa "Hello! Again!"
MyClass::sayHelloAgain();
In questo caso per i metodi statici, sarebbe possibile accedervi anche in questo modo, ma è fortemente sconsigliato:
PHP:
// Istanzio la classe
$myClass_1 = new MyClass();
$myClass_2 = new MyClass();
// stampa "Hello!"
$myClass_1->sayHello();
// stampa "Hello! Again!"
$myClass_1->sayHelloAgain();
?>
Spero di aver chiarito il tuo dubbio.