2010-02-04 3 views
111

Comment puis-je appeler une méthode statique d'une autre méthode à l'intérieur de la même classe?appelle une méthode statique à l'intérieur d'une classe?

$this->staticMethod(); 

ou

$this::staticMethod(); 
+11

Vous pourriez être intéressé par cet ('' self' contre this' $) http://stackoverflow.com/questions/151969/php-self-vs-this –

+0

Juste un FYI, votre premier exemple est une variable d'instance appelant une méthode statique qui n'est pas possible car une méthode statique fait partie de la classe et n'est pas accessible via une variable d'instance. – joejoeson

+0

vous pouvez supprimer le $ this maintenant s'il vous plaît cela ne fonctionne pas si seulement en utilisant des méthodes statiques et aucune instance existe. – malhal

Répondre

211
+0

... mais pourquoi? $ this-> staticMethod() fonctionne aussi. Pouvez-vous expliquer pourquoi self :: staticMethod() plus correct (si c'est le cas)? –

+15

@Ian Dunn En résumé, '$ this' n'existe que si un objet a été instancié et que vous ne pouvez utiliser' $ this-> méthode' que depuis un objet existant. Si vous n'avez pas d'objet mais appelez simplement une méthode statique et que vous voulez appeler une autre méthode statique dans la même classe, vous devez utiliser 'self ::'. Donc, pour éviter les erreurs potentielles (et les avertissements stricts), il vaut mieux utiliser 'self'. – jeroen

+0

Vous ne pouvez pas utiliser $ this dans une fonction statique .... – patrick

36

Supposons que ceci 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"; } 
} 

A partir de la méthode foo(), regardons les différentes options:

$this->staticMethod(); 

Alors que les appels staticMethod() comme une méthode d'instance, non? Ce ne est pas. C'est parce que la méthode est déclarée public static l'interpréteur l'appellera comme une méthode statique, donc il fonctionnera comme prévu. On pourrait faire valoir que cela rend moins évident à partir du code qu'un appel de méthode statique a lieu.

$this::staticMethod(); 

Depuis PHP 5.3, vous pouvez utiliser $var::method() signifier <class-of-$var>::; c'est très pratique, bien que le cas d'utilisation ci-dessus soit encore assez peu conventionnel. Alors, qui nous amène à la façon la plus courante d'appeler une méthode statique:

self::staticMethod(); 

Maintenant, avant de commencer à penser que le :: est l'opérateur d'appel statique, laissez-moi vous donner un autre exemple:

self::bar(); 

Cela affichera baz = 1, ce qui signifie que $this->bar() et 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 fonctionner parent::, self:: et static:: et vous donner accès à des variables statiques; comment une méthode est appelée dépend de sa signature et comment l'appelant a été appelé.

Pour voir tout cela en action, voir this 3v4l.org output.

+6

+1 pour l'explication – FreshPro

+0

'self :: bar()' semble trompeur - est-ce maintenant obsolète? (en utilisant 'self ::' pour appeler une méthode d'instance plutôt qu'une méthode statique). – ToolmakerSteve

+0

@ToolmakerSteve de quelle manière diriez-vous que c'est trompeur? –

7

Ceci est une réponse très tardive, mais les deux réponses précédentes sont un peu trompeuses.

Lorsqu'il s'agit d'appeler des méthodes statiques en PHP à partir d'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

En effet, self fait référence à la classe dans laquelle le code est, plutôt que le c Lass du code, il est appelé.

Si vous souhaitez utiliser une méthode définie sur une classe qui hérite de la classe d'origine, vous devez utiliser quelque chose comme:

$class = get_called_class(); 
$class::function_name(); 
+2

J'ai trouvé cela informatif. Un petit nit, je ne dirais pas que les autres réponses sont "trompeuses". Plus précis de dire qu'ils sont "incomplets"; ils n'abordent pas la question (non-demandée) de ce que 'self ::' fait dans le cas (rare) où une méthode statique A appelle une autre méthode statique B, et B a été surchargé dans une sous-classe. À mon humble avis, il est moins déroutant de restreindre la méthode de substitution aux méthodes "instance"; utiliser cette capacité avec parcimonie au niveau statique. Autrement dit, les lecteurs de votre code s'attendent à ce que la méthode soit surchargée de méthodes d'instance (c'est l'essence du codage OO), mais pas de méthodes statiques. – ToolmakerSteve

+1

Très utile et il est logique qu'une extension de la classe ne soit pas la classe d'origine. Par conséquent, il va de soi que 'self' ne serait pas utilisé dans ce cas. Vous avez déclaré une classe distincte en tant qu'extension de la première classe. L'utilisation de 'self' dans la classe étendue renvoie à la classe étendue. Cela ne contredit pas les autres réponses, mais cela aide certainement à démontrer la portée de 'self'. – iyrin

1

Dans la dernière version de PHP self::staticMethod(); également ne fonctionnera pas. Il va lancer l'erreur standard stricte.

Dans ce cas, nous pouvons créer un objet de même classe et appeler par objet

est ici l'exemple

class Foo { 

    public function fun1() { 
     echo 'non-static'; 
    } 

    public static function fun2() { 
     echo (new self)->fun1(); 
    } 
} 
+0

Bonne entrée, merci – Joundill

Questions connexes