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?
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).
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'
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.
L'appel statique de méthodes non statiques génère un avertissement de niveau E_STRICT.
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.
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. :(