187 votes

appeler une méthode statique à l'intérieur d'une classe ?

Comment appeler une méthode statique à partir d'une autre méthode dans la même classe ?

$this->staticMethod();

ou

$this::staticMethod();

13 votes

Vous pourriez être intéressé par cette ( self vs. $this ) : stackoverflow.com/questions/151969/php-self-vs-this

1 votes

Pour info, votre premier exemple est une variable d'instance appelant une méthode statique, ce qui n'est pas possible car une méthode statique fait partie de la classe et n'est pas accessible par une variable d'instance.

0 votes

Vous pouvez supprimer le $this maintenant s'il vous plaît cela ne fonctionne pas si vous utilisez uniquement des méthodes statiques et qu'aucune instance n'existe.

375voto

jeroen Points 47068

1 votes

...mais pourquoi ? $this->staticMethod() fonctionne aussi. Pouvez-vous expliquer pourquoi self::staticMethod() est plus correct (si c'est le cas) ?

33 votes

@Ian Dunn En termes simples, $this n'existe que si un objet a été instancié et vous ne pouvez utiliser que l'option $this->method à partir d'un objet existant. Si vous n'avez pas d'objet mais que vous appelez simplement une méthode statique et que dans cette méthode vous voulez appeler une autre méthode statique de la même classe, vous devez utiliser la fonction self:: . Ainsi, pour éviter les erreurs potentielles (et les avertissements stricts), il est préférable d'utiliser self .

1 votes

Merci. Dans Laravel, j'ai découvert que j'appelais accidentellement la méthode statique à travers un contrôleur étendu en utilisant la méthode suivante $this mais le problème n'est apparu qu'au moment où le code a été mis à jour. stage . aucune erreur n'est revenue, la valeur était juste 0 . soyez prudent avec cela, utilisez self::

47voto

Jack Points 88446

Supposons que c'est votre classe :

class Test
{
    private $baz = 1;

    public function foo() { ... }

    public function bar() 
    {
        printf("baz = %d\n", $this->baz);
    }

    public static function staticMethod() { echo "static method\n"; }
}

De l'intérieur de la foo() examinons les différentes options :

$this->staticMethod();

Donc, cela appelle staticMethod() comme une méthode d'instance, non ? Ce n'est pas le cas. Cela est dû au fait que la méthode est déclarée comme public static l'interpréteur l'appellera comme une méthode statique, donc cela fonctionnera comme prévu. On pourrait argumenter qu'en procédant ainsi, il est moins évident de voir dans le code qu'un appel à une méthode statique a lieu.

$this::staticMethod();

Depuis PHP 5.3, vous pouvez utiliser $var::method() pour signifier <class-of-$var>:: C'est très pratique, bien que le cas d'utilisation ci-dessus soit encore peu conventionnel. Cela nous amène à la façon la plus courante d'appeler une méthode statique :

self::staticMethod();

Maintenant, avant que vous ne commenciez à penser que le :: es le site opérateur d'appel statique, laissez-moi vous donner un autre exemple :

self::bar();

Ceci imprimera baz = 1 ce qui signifie que $this->bar() y self::bar() font exactement la même chose ; c'est parce que :: est juste un opérateur de résolution de portée. Il est là pour faire parent:: , self:: y static:: fonctionnent et vous donnent accès aux variables statiques ; la façon dont une méthode est appelée dépend de sa signature et de la façon dont l'appelant a été appelé.

Pour voir tout cela en action, voir cette sortie 3v4l.org .

0 votes

self::bar() semble trompeuse - est-elle maintenant dépréciée ? (en utilisant self:: pour appeler une méthode d'instance plutôt qu'une méthode statique).

0 votes

@ToolmakerSteve en quoi diriez-vous que c'est trompeur ?

0 votes

Logiquement parlant, il n'y a pas self lors de l'invocation d'une méthode statique. Par définition : la méthode statique est appelable de n'importe où, et ne reçoit pas de paramètre "self". Néanmoins, je vois la commodité de cette php afin de ne pas avoir à écrire la syntaxe MyClassName:: . Je suis habitué aux langages à typage statique, où le compilateur doit recevoir toutes les variables disponibles dans la portée actuelle, donc (l'équivalent de) self:: peut être omise. On a donc seulement dit self instanceMethod ; aucune raison de dire self staticMethod .

18voto

Joundill Points 690

Il s'agit d'une réponse très tardive, mais qui ajoute quelques détails aux réponses précédentes.

Lorsqu'il s'agit d'appeler des méthodes statiques en PHP depuis une autre méthode statique de la même classe, il est important de faire la différence entre self et le nom de la classe.

Prenez par exemple ce code :

class static_test_class {
    public static function test() {
        echo "Original class\n";
    }

    public static function run($use_self) {
        if($use_self) {
            self::test();
        } else {
            $class = get_called_class();
            $class::test(); 
        }
    }
}

class extended_static_test_class extends static_test_class {
    public static function test() {
        echo "Extended class\n";
    }
}

extended_static_test_class::run(true);
extended_static_test_class::run(false);

La sortie de ce code est :

Classe d'origine

Classe étendue

Cela s'explique par le fait que self fait référence à la classe dans laquelle se trouve le code, plutôt qu'à la classe du code à partir duquel il est appelé.

Si vous voulez utiliser une méthode définie sur une classe qui hérite de la classe originale, vous devez utiliser quelque chose comme :

$class = get_called_class();
$class::function_name();

2voto

Nishad Up Points 1631

Dans la dernière version de PHP self::staticMethod(); ne fonctionnera pas non plus. Il lancera l'erreur standard stricte.

Dans ce cas, nous pouvons créer un objet de la même classe et appeler par objet

voici l'exemple

class Foo {

    public function fun1() {
        echo 'non-static';   
    }

    public static function fun2() {
        echo (new self)->fun1();
    }
}

0voto

Theakash Points 91

Appeler une méthode statique à l'intérieur d'une classe

className::staticFunctionName

exemple

ClassName::staticMethod();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X