Comme vous j'ai longtemps utilisé le mot clé self dans mes classes PHP jusqu'à me heuter à ses limites. Et là j'ai compris l'utilité de static.
Comme vous j'ai longtemps utilisé le mot-clé self
dans mes classes PHP jusqu'à me heurter à ses limites. Et là j'ai compris l'utilité de static
à la place de self
.
Voici une classe PHP tout ce qu'il y a de plus classique :
<?php
class Foo
{
protected static $myStaticVar = 'foo';
public function getMyStaticVar(): string
{
return self::$myStaticVar;
}
}
<?php
class Foo
{
protected static $myStaticVar = 'foo';
public function getMyStaticVar(): string
{
return self::$myStaticVar;
}
}
Je peux donc récupérer ma valeur comme cela :
$foo = new Foo();
$foo->getMyStaticVar();
$foo = new Foo();
$foo->getMyStaticVar();
Jusque-là tout fonctionne correctement.
Mais si par exemple je souhaite étendre de ma classe Foo
et changer la valeur de ma variable :
<?php
class Bar extends Foo
{
protected static $myStaticVar = 'bar';
}
<?php
class Bar extends Foo
{
protected static $myStaticVar = 'bar';
}
Le souci c'est que quand je vais l'appeler comme cela :
$bar = new Bar();
$bar->getMyStaticVar();
$bar = new Bar();
$bar->getMyStaticVar();
Il va me retourner foo
et non bar
.
Pourtant j'ai bien redéfini ma valeur vous allez me dire. Et bien oui, mais le mot-clé self
fait référence à la classe courante où est la méthode. Or, ma méthode getMyStaticVar
n'est définie que dans la classe Foo
et non Bar
.
Par contre, si je remplace self
par static
dans ma méthode, PHP va bien de retourner bar
car static
fait référence à la classe et ses enfants.
Voilà pourquoi il est important de toujours utiliser static
dans ses méthodes, sauf si le comportement souhaité est celui de self
.