self
indica la classe in cui è scritto.
Quindi, se il tuo metodo getInstance è in un nome di classe MyClass
, la riga seguente:
self::$_instance = new self();
Farà lo stesso di:
self::$_instance = new MyClass();
Modifica: un paio di informazioni in più, dopo i commenti.
Se hai due classi che si estendono a vicenda, hai due situazioni:
getInstance
è definito nella classe figlio
getInstance
è definito nella classe genitore
La prima situazione sarebbe simile a questa (ho rimosso tutto il codice non necessario, per questo esempio - dovrai aggiungerlo di nuovo per ottenere il comportamento singleton) *:
class MyParentClass {
}
class MyChildClass extends MyParentClass {
public static function getInstance() {
return new self();
}
}
$a = MyChildClass::getInstance();
var_dump($a);
Qui otterrai:
object(MyChildClass)#1 (0) { }
Il che significa che self
i mezzi MyChildClass
- cioè la classe in cui è scritto.
Per la seconda situazione, il codice sarebbe simile a questo:
class MyParentClass {
public static function getInstance() {
return new self();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
E otterrai questo tipo di output:
object(MyParentClass)#1 (0) { }
Il che significa che self
i mezzi MyParentClass
- cioè anche qui, la classe in cui è scritto .
Con PHP <5.3, "la classe in cui è scritto" è importante e talvolta può causare problemi.
Ecco perché PHP 5.3 introduce un nuovo utilizzo per la static
parola chiave: ora può essere utilizzata esattamente dove l'abbiamo usata self
in quegli esempi:
class MyParentClass {
public static function getInstance() {
return new static();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
Ma, con static
invece di self
, ora otterrai:
object(MyChildClass)#1 (0) { }
Il che significa che quel static
tipo di punti punta alla classe che viene utilizzata (che abbiamo usato MyChildClass::getInstance()
) e non a quella in cui è scritta.
Ovviamente, il comportamento di self
non è stato modificato, per non rompere le applicazioni esistenti - PHP 5.3 ha appena aggiunto un nuovo comportamento, riciclando la static
parola chiave.
E, parlando di PHP 5.3, potresti dare un'occhiata alla pagina Late Static Bindings del manuale PHP.