Comment appeler une méthode statique à partir d'une autre méthode dans la même classe ?
$this->staticMethod();
ou
$this::staticMethod();
Comment appeler une méthode statique à partir d'une autre méthode dans la même classe ?
$this->staticMethod();
ou
$this::staticMethod();
...mais pourquoi ? $this->staticMethod() fonctionne aussi. Pouvez-vous expliquer pourquoi self::staticMethod() est plus correct (si c'est le cas) ?
@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
.
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::
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 .
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).
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
.
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();
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();
}
}
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.
13 votes
Vous pourriez être intéressé par cette (
self
vs.$this
) : stackoverflow.com/questions/151969/php-self-vs-this1 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.
0 votes
Incroyable comme il est difficile de trouver cette question et la réponse. C'est parce que PHP ne les désigne pas par "méthode de classe" ou "fonction de classe". eyeroll