109 votes

Fonction statique php

J'ai une question concernant la fonction statique en php.

supposons que j'ai une classe

class test {
    public function sayHi() {
        echo 'hi';
    }
}

si je le fais test::sayHi(); il fonctionne sans problème.

class test {
    public static function sayHi() {
        echo 'hi';
    }
}

test::sayHi(); fonctionne également.

Quelles sont les différences entre la première classe et la deuxième classe ?

Quelle est la particularité d'une fonction statique ?

17 votes

Depuis php7, vous ne pouvez pas appeler une méthode non statique de manière statique.

155voto

Jonathan Fingland Points 26224

En première classe, sayHi() est en fait une méthode d'instance que vous appelez comme une méthode statique et vous vous en sortez parce que sayHi() ne fait jamais référence à $this .

Les fonctions statiques sont associées à la classe, et non à une instance de la classe. En tant que telles, $this n'est pas disponible à partir d'un contexte statique ( $this ne pointe vers aucun objet).

22 votes

Maintenant, l'appel statique de méthodes non statiques fonctionne mais est déprécié. Soyez prudent en utilisant cette syntaxe pour les méthodes d'instance !

1 votes

C'est pourquoi on dit que c'est une fonction statique, parce qu'il n'y a pas d'instance multiple avec un flux de données dynamique et une sortie dynamique. Guidez-moi. @chaos

22voto

user2132859 Points 66

Simplement, les fonctions statiques fonctionnent indépendamment de la classe à laquelle elles appartiennent.

$this signifie, ceci est un objet de cette classe. Il ne s'applique pas aux fonctions statiques.

class test {
    public function sayHi($hi = "Hi") {
        $this->hi = $hi;
        return $this->hi;
    }
}
class test1 {
    public static function sayHi($hi) {
        $hi = "Hi";
        return $hi;
    }
}

//  Test
$mytest = new test();
print $mytest->sayHi('hello');  // returns 'hello'
print test1::sayHi('hello');    //  returns 'Hi'

9 votes

Ok, je ne suis pas un magicien de PHP, mais la variable ('hello') qui est passée à la fonction statique, n'est-elle pas explicitement remplacée par 'Hi' ? Cela signifie que la ligne print test1::sayHi('hello') ; ne renverrait pas 'hello', mais 'hi' ?

7 votes

Cette réponse est bâclée (l'effet des fonctions statiques puede dépendent de la classe dans laquelle ils se trouvent) et les exemples ne sont pas très clairs.

0 votes

Ce n'est pas un très bon exemple. $hi = 'Hi' ; écrase l'argument donné, et n'a rien à voir avec la déclaration statique. Je corrigerais cela de la manière suivante : self::$hi = $hi ; et cela fonctionnerait exactement comme la déclaration non statique. Vous pouvez accéder aux variables de classe avec self: : au lieu de $this->.

20voto

chaos Points 69029

La seule différence est que tu n'auras pas $this fournie à l'intérieur de la fonction statique. Si vous essayez d'utiliser $this vous obtiendrez un Fatal error: Using $this when not in object context .

Bon, ok, une autre différence : une E_STRICT est généré par votre premier exemple.

1 votes

Je n'ai aucun avertissement lorsque j'utilise le premier et je suis en php7.

0 votes

Pourquoi n'avons-nous pas $this à l'intérieur d'une fonction statique ? Quelle est la logique architecturale de ceci ? Merci.

0 votes

@LucasBustamante : $this fait référence à l'objet courant. Dans une fonction statique, il n'y a pas d'objet courant ; la fonction existe sur la classe sans qu'il soit nécessaire de faire référence à une instance d'objet de cette classe.

2voto

Czimi Points 1145

En bref, vous n'avez pas l'objet en tant que $this dans le second cas, car la méthode statique est une fonction/méthode de la classe et non de l'instance de l'objet.

1 votes

Static est simplement la façon dont vous définissez les fonctions de classe ? pas d'autres fantaisies ? Donc vous dites que si cela avait été appelé "class_method" plutôt que "static", cela aurait été plus sémantique ?

1voto

yogesh Points 19

Après avoir essayé des exemples (PHP 5.3.5), j'ai constaté que dans les deux cas de définition de fonctions, vous ne pouvez pas utiliser $this pour travailler sur les fonctions de classe. Je n'ai donc pas encore trouvé de différence entre eux :(

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