self
pointe vers la classe dans laquelle il est écrit.
Donc, si votre méthode getInstance est dans un nom de classe MyClass
, la ligne suivante:
self::$_instance = new self();
Fera la même chose que:
self::$_instance = new MyClass();
Edit: quelques informations supplémentaires, après les commentaires.
Si vous avez deux classes qui s'étendent l'une l'autre, vous avez deux situations:
getInstance
est défini dans la classe enfant
getInstance
est défini dans la classe parente
La première situation ressemblerait à ceci (j'ai supprimé tout le code non nécessaire, pour cet exemple - vous devrez le rajouter pour obtenir le comportement singleton) *:
class MyParentClass {
}
class MyChildClass extends MyParentClass {
public static function getInstance() {
return new self();
}
}
$a = MyChildClass::getInstance();
var_dump($a);
Ici, vous obtiendrez:
object(MyChildClass)#1 (0) { }
Ce qui veut self
direMyChildClass
- c'est-à-dire la classe dans laquelle il est écrit.
Pour la deuxième situation, le code ressemblerait à ceci:
class MyParentClass {
public static function getInstance() {
return new self();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
Et vous obtiendrez ce genre de sortie:
object(MyParentClass)#1 (0) { }
Ce qui signifie self
signifie MyParentClass
- c'est-à-dire ici aussi, la classe dans laquelle il est écrit .
Avec PHP <5.3, que «la classe dans laquelle elle est écrite» est importante - et peut parfois causer des problèmes.
C'est pourquoi PHP 5.3 introduit une nouvelle utilisation du static
mot - clé: il peut maintenant être utilisé exactement là où nous l'avons utilisé self
dans ces exemples:
class MyParentClass {
public static function getInstance() {
return new static();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
Mais, avec static
au lieu de self
, vous obtiendrez maintenant:
object(MyChildClass)#1 (0) { }
Ce qui signifie que cette static
sorte de pointage vers la classe utilisée (nous avons utiliséMyChildClass::getInstance()
), et non celle dans laquelle elle est écrite.
Bien sûr, le comportement de self
n'a pas été changé, pour ne pas casser les applications existantes - PHP 5.3 vient d'ajouter un nouveau comportement, recyclant lestatic
mot clé.
Et, en parlant de PHP 5.3, vous voudrez peut-être jeter un œil à la page Late Static Bindings du manuel PHP.