fonction statique php

108

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();cela fonctionne sans problème.

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

test::sayHi(); fonctionne aussi bien.

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

Quelle est la particularité d'une fonction statique?

Lune
la source
15
À partir de php7, vous ne pouvez pas appeler de méthode non statique de manière statique
sanjay yadav

Réponses:

153

Dans la première classe, sayHi()est en fait une méthode d'instance que vous appelez en tant que méthode statique et que vous vous en sortez car elle sayHi()ne fait jamais référence $this.

Les fonctions statiques sont associées à la classe, pas à une instance de la classe. En tant que tel, $thisn'est pas disponible à partir d'un contexte statique ( $thisne pointe vers aucun objet).

Jonathan Fingland
la source
22
Désormais, l'appel statique des méthodes non statiques fonctionne mais est obsolète. Soyez prudent en utilisant cette syntaxe pour les méthodes d'instance!
Jet
1
Alors c'est pourquoi ils le disent comme une fonction statique? car il n'y a pas d'instance multiple avec un flux de données dynamique et une sortie dynamique. Just guide me. @ Chaos
dim
22

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

$ cela signifie que c'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'
user2132859
la source
9
Ok, je ne suis pas un assistant PHP, mais la variable ('hello') qui est passée à la fonction statique n'est-elle pas explicitement écrasée par 'Hi'? Cela signifie que la ligne affiche test1 :: sayHi ('hello'); ne retournerait pas «bonjour», mais retournerait «salut»?
Fnord23
6
Cette réponse est bâclée (l'effet des fonctions statiques peut dépendre de la classe dans laquelle elles se trouvent) et les exemples ne clarifient pas ce point.
reinierpost
Pas un très bon exemple. $ hi = 'Salut'; écrase l'argument donné et n'a rien à voir avec la déclaration statique. Je corrigerais ceci comme: self :: $ hi = $ hi; et cela fonctionnerait exactement comme le non statique. Vous pouvez accéder aux variables de classe avec self :: au lieu de $ this->
GotBatteries
20

Toute la différence est que vous ne recevez pas $thisla fonction statique. Si vous essayez d'utiliser $this, vous obtiendrez un fichier Fatal error: Using $this when not in object context.

Eh bien, d'accord, une autre différence: un E_STRICTavertissement est généré par votre premier exemple.

le chaos
la source
1
Je n'ai aucun avertissement lorsque j'utilise d'abord et que je suis en php7
ashkan nasirzadeh
Pourquoi n'avons-nous pas $ this dans une fonction statique? Quelle est la logique architecturale de cela? Merci.
Lucas Bustamante
@LucasBustamante: $thisfait 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 besoin ni référence à une instance d'objet de cette classe.
chaos
3

L'appel de méthodes non statiques génère un avertissement de niveau E_STRICT de manière statique.


la source
2

En un mot, vous n'avez pas l'objet comme $ this dans le second cas, car la méthode statique est une fonction / méthode de la classe et non l'instance d'objet.

Czimi
la source
1
est statique simplement comment définir les fonctions de classe? aucune autre affaire de fantaisie? Donc vous dites que si cela avait été appelé "class_method" plutôt que "static", ce serait plus sémantique?
ahnbizcad
1

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

yogesh
la source