Pourquoi utiliser static à la place de self dans les classes PHP ?

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.

Jérémy 🤘
Jérémy 🤘

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 :

Copier
<?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 :

Copier
$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 :

Copier
<?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 :

Copier
$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.

Demo

Source