157 votes

PHP Erreur fatale : Utilisation de $this en dehors du contexte objet

J'ai un problème :

Je suis en train d'écrire une nouvelle WebApp sans Framework.

Dans mon index.php Je l'utilise : require_once('load.php');

Et dans load.php J'utilise require_once('class.php'); pour charger mon class.php .

Dans mon class.php J'ai cette erreur :

Erreur fatale : Using $this when not in object context in class.php on line ... (dans cet exemple, ce serait 11)

Par exemple, comment mon class.php est écrit :

class foobar {

    public $foo;

    public function __construct() {
        global $foo;

        $this->foo = $foo;
    }

    public function foobarfunc() {
        return $this->foo();
    }

    public function foo() {
        return $this->foo;
    }
}

Dans mon index.php Je charge peut-être foobarfunc() así:

foobar::foobarfunc();

mais peut aussi être

$foobar = new foobar;
$foobar->foobarfunc();

Pourquoi l'erreur survient-elle ?

2 votes

Par coïncidence, j'ai été confronté à cette erreur pendant environ 3 heures hier :)

0 votes

@jack dans mon cas, j'utilisais este sur la fonction statique

218voto

Sarfraz Points 168484

Dans mon index.php, je charge peut-être foobarfunc() comme ceci :

 foobar::foobarfunc();  // Wrong, it is not static method

mais peut aussi être

$foobar = new foobar;  // correct
$foobar->foobarfunc();

Vous ne pouvez pas invoquer la méthode de cette manière car il ne s'agit pas d'une méthode statique.

foobar::foobarfunc();

Vous devriez plutôt utiliser :

$foobar->foobarfunc();

Si toutefois vous avez créé une méthode statique du type :

static $foo; // your top variable set as static

public static function foobarfunc() {
    return self::$foo;
}

alors vous pouvez utiliser ceci :

foobar::foobarfunc();

1 votes

Le fait que les variables aient le même nom n'est pas un problème. $this->foo est un membre de la classe, tandis que $foo est juste une variable dans la portée de la fonction (importée de la portée globale). Les noms de fonction portant le même nom qu'un membre ne posent pas non plus de problème.

179 votes

Vous ne pouvez pas utiliser $this dans une méthode statique.

5 votes

C'est drôle comme une réponse complètement fausse obtient quand même des votes positifs. $this n'est pas disponible dans le contexte de la classe. Le PO obtiendra la même erreur que dans l'exemple ci-dessus.

32voto

Pascal MARTIN Points 195780

Vous appelez une méthode non statique :

public function foobarfunc() {
    return $this->foo();
}

Utilisation d'un appel statique :

foobar::foobarfunc();

Lors de l'utilisation d'un appel statique, la fonction sera appelée (même si elle n'est pas déclarée comme static ) mais, comme il n'y a pas d'instance d'un objet, il n'y a pas de $this .

Donc :

  • Vous ne devez pas utiliser les appels statiques pour les méthodes non statiques.
  • Vos méthodes statiques (ou méthodes appelées statiquement) ne peuvent pas utiliser $this, qui pointe normalement vers l'instance actuelle de la classe, car il n'y a pas d'instance de classe lorsque vous utilisez des appels statiques.

Ici, les méthodes de votre classe utilisent l'instance actuelle de la classe, car elles ont besoin d'accéder à l'objet de la classe. $foo de la classe.

Cela signifie que vos méthodes ont besoin d'une instance de la classe - ce qui signifie qu'elles ne peuvent pas être statiques.

Cela signifie que vous ne devez pas utiliser les appels statiques : vous devez instancier la classe, et utiliser l'objet pour appeler les méthodes, comme vous l'avez fait dans votre dernière portion de code :

$foobar = new foobar();
$foobar->foobarfunc();

Pour plus d'informations, n'hésitez pas à lire, dans le manuel PHP :

Notez également que vous n'avez probablement pas besoin de cette ligne dans votre fichier __construct méthode :

global $foo;

Utilisation de la global mot-clé fera le $foo variable, déclarée en dehors de toutes les fonctions et classes, visible à l'intérieur de cette méthode... Et vous n'avez probablement pas une telle $foo variable.

Pour accéder à la $foo propriété de la classe vous n'avez qu'à utiliser $this->foo comme vous l'avez fait.

13voto

Gordon Points 156415

Si vous invoquez foobarfunc con opérateur de la lunette de résolution ( :: ), alors vous l'appelez statiquement par exemple, au niveau de la classe au lieu du niveau de l'instance. en utilisant $this lorsqu'il n'est pas dans le contexte de l'objet . $this n'existe pas dans le contexte de la classe.

Si vous activez E_STRICT PHP va émettre un avis à ce sujet :

Strict Standards: 
Non-static method foobar::foobarfunc() should not be called statically

Faites plutôt ceci

$fb = new foobar;
echo $fb->foobarfunc();

En passant, je suggère de ne pas utiliser global dans vos classes. Si vous avez besoin de quelque chose de l'extérieur à l'intérieur de votre classe, passez-le par le constructeur. Ceci est appelé Injection de dépendances et cela rendra votre code beaucoup plus maintenable et moins dépendant de choses extérieures.

7voto

Ramasamy Kasi Points 21

D'abord, tu dois comprendre une chose, $this à l'intérieur d'une classe indique le objet actuel .
C'est-à-dire que vous êtes créé en dehors de la classe pour appeler la fonction ou la variable de la classe.

Ainsi, lorsque vous appelez la fonction de votre classe comme foobar::foobarfunc(), l'objet n'est pas créé. Mais dans cette fonction vous avez écrit return $this->foo(). Maintenant, ici, $this n'est rien. C'est pourquoi il dit Utilisation de $this en dehors du contexte objet dans class.php

Solutions :

  1. Créer un objet et appeler foobarfunc().

  2. Appelez foo() en utilisant le nom de la classe à l'intérieur de foobarfunc().

3 votes

Ou utilisez simplement self: : au lieu de $this

4voto

Pekka 웃 Points 249607

Lorsque vous appelez la fonction dans un contexte statique, $this n'existe tout simplement pas.

Vous devez utiliser this::xyz() à la place.

Pour savoir dans quel contexte vous vous trouvez lorsqu'une fonction peut être appelée à la fois de manière statique et dans une instance d'objet, une bonne approche est décrite dans cette question : Comment savoir si je suis statique ou un objet ?

Prograide.com

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.

Powered by:

X