web-dev-qa-db-fra.com

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 fais test::sayHi(); cela 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 et la deuxième classe?

Quelle est la particularité d'une fonction statique?

103
Moon

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 tirez parce que 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, $this n'est pas disponible dans un contexte statique ($this ne pointe pas vers un objet).

147

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

Cela signifie que ceci est un objet de cette classe. Cela 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'
21
user2132859

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

Bon, d'accord, une autre différence: un E_STRICT _ warning est généré par votre premier exemple.

20
chaos

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

3
user2598812

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 de l'objet.

2
Czimi

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 opérateur pour travailler sur les fonctions de classe. Donc, je ne pouvais pas encore trouver une différence en eux. :(

1
yogesh