self
de points à la classe dans laquelle elle est écrite.
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 : un couple plus d'infos, d'après les commentaires.
Si vous avez deux classes qui étendent les uns des autres, vous avez deux situations :
-
getInstance
est définie dans la classe enfant
-
getInstance
est défini dans la classe parent
La première situation devrait ressembler à ceci (j'ai supprimé tous les codes non nécessaires, pour cet exemple, vous devez les ajouter en arrière pour obtenir le singleton comportement)* :
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 signifie self
moyen MyChildClass
-- c'est à dire la classe dans laquelle elle est écrite.
Pour la deuxième situation, le code ressemblera à ceci :
class MyParentClass {
public static function getInstance() {
return new self();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
Et vous obtenez ce genre de résultat :
object(MyParentClass)#1 (0) { }
Ce qui signifie self
moyen MyParentClass
-- c'est à dire ici aussi, la classe dans laquelle elle est écrite.
Avec PHP < 5.3, que "la classe dans laquelle il est écrit" c'est important-et peut parfois causer des problèmes.
C'est pourquoi PHP 5.3 introduit une nouvelle utilisation pour l' static
mot-clé : il peut maintenant être utilisé exactement où nous 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 allez obtenir :
object(MyChildClass)#1 (0) { }
Ce qui signifie qu' static
sorte de points de la classe qui est utilisée (nous avons utilisé MyChildClass::getInstance()
), et non pas celui dans lequel il est écrit.
Bien sûr, le comportement de l' self
n'a pas été modifié, pour ne pas casser les applications existantes -- PHP 5.3 juste d'ajouter un nouveau comportement, recyclage de l' static
mot-clé.
Et, parlant de PHP 5.3, vous voudrez peut-être jeter un oeil à la résolution Statique à la volée page du manuel PHP.