web-dev-qa-db-fra.com

Quelle est la différence entre self :: $ bar et static :: $ bar en PHP?

Duplicate possible:
Nouveau moi vs nouveau statique

Quelle est la différence entre self et static dans l'exemple ci-dessous?

class Foo
{
    protected static $bar = 1234;

    public static function instance()
    {
        echo self::$bar;
        echo "\n";
        echo static::$bar;
    }

}

Foo::instance();

produit

1234
1234
108
cwd

Lorsque vous utilisez self pour faire référence à un membre de la classe, vous faites référence à la classe dans laquelle vous utilisez le mot-clé. Dans ce cas, votre classe Foo définit une propriété statique protégée appelée $bar. Lorsque vous utilisez self dans la classe Foo pour faire référence à la propriété, vous faites référence à la même classe.

Par conséquent, si vous avez essayé d'utiliser self::$bar ailleurs dans votre classe Foo mais vous aviez une classe Bar avec une valeur différente pour la propriété, elle utiliserait Foo::$bar au lieu de Bar::$bar, qui peut ne pas être ce que vous souhaitez:

class Foo
{
    protected static $bar = 1234;
}

class Bar extends Foo
{
    protected static $bar = 4321;
}

Lorsque vous utilisez static, vous appelez une fonctionnalité appelée liaisons statiques tardives (introduite dans PHP 5.3).

Dans le scénario ci-dessus, utiliser static au lieu de self donnera Bar::$bar utilisé au lieu de Foo::$bar, car l’interprète prend alors en compte la redéclaration dans la classe Bar.

Vous utilisez généralement des liaisons statiques tardives pour les méthodes, voire la classe elle-même, plutôt que des propriétés, car vous ne redéclarez pas souvent les propriétés dans les sous-classes; Vous trouverez un exemple d'utilisation du mot clé static pour appeler un constructeur à liaison tardive dans la question suivante: Nouveau self vs new static

Cependant, cela n'empêche pas d'utiliser static avec des propriétés également.

174
BoltClock
self - refers to the same class whose method the new operation takes place in.

static - in PHP 5.3's late static binding refers to whatever class in the hierarchy which you call the method on.

Dans l'exemple suivant (voir get_called_class () ), la classe B hérite des deux méthodes de la classe A. Self est lié à A car il est défini dans l'implémentation de la méthode de A, alors que static est lié à la classe appelée. malgré le fait que c'est aussi dans la mise en œuvre de la méthode de A.

class A {
    public static function get_A() {
        return new self();
    }

    public static function get_me() {
        return new static();
    }
}

class B extends A {}

echo get_class(B::get_A());  // A
echo get_class(B::get_me()); // B
echo get_class(A::get_me()); // A
43
Abid Hussain