Que signifie la variable $ this en PHP?

103

Je vois la variable $thisen PHP tout le temps et je n'ai aucune idée à quoi elle sert. Je ne l'ai jamais utilisé personnellement.

Quelqu'un peut-il me dire comment la variable $thisfonctionne en PHP?

waiwai933
la source

Réponses:

130

C'est une référence à l'objet courant, il est le plus couramment utilisé dans le code orienté objet.

Exemple:

<?php
class Person {
    public $name;

    function __construct( $name ) {
        $this->name = $name;
    }
};

$jack = new Person('Jack');
echo $jack->name;

Cela stocke la chaîne «Jack» en tant que propriété de l'objet créé.

meder omuraliev
la source
1
J'ai vu un exemple de code similaire dans le didacticiel KillerPHP OOP :) killerphp.com/tutorials/php-objects-page-1
Edson
Explication agréable et facile. @meder omuraliev
Pie
40

La meilleure façon d'en savoir plus sur la $thisvariable en PHP est de l'essayer contre l'interpréteur dans divers contextes:

print isset($this);              //true,   $this exists
print gettype($this);            //Object, $this is an object 
print is_array($this);           //false,  $this isn't an array
print get_object_vars($this);    //true,   $this's variables are an array
print is_object($this);          //true,   $this is still an object
print get_class($this);          //YourProject\YourFile\YourClass
print get_parent_class($this);   //YourBundle\YourStuff\YourParentClass
print gettype($this->container); //object
print_r($this);                  //delicious data dump of $this
print $this->yourvariable        //access $this variable with ->

Ainsi, la $thispseudo-variable a la méthode et les propriétés de l'objet courant. Une telle chose est utile car elle vous permet d'accéder à toutes les variables membres et méthodes membres de la classe. Par exemple:

Class Dog{
    public $my_member_variable;                             //member variable

    function normal_method_inside_Dog() {                   //member method

        //Assign data to member variable from inside the member method
        $this->my_member_variable = "whatever";

        //Get data from member variable from inside the member method.
        print $this->my_member_variable;
    }
}

$thisest une référence à un PHP Objectqui a été créé par l'interpréteur pour vous, qui contient un tableau de variables.

Si vous appelez à l' $thisintérieur d'une méthode normale dans une classe normale, $thisrenvoie l'Object (la classe) à laquelle appartient cette méthode.

Il est possible de ne $thispas être défini si le contexte n'a pas d'objet parent.

php.net a une grande page sur la programmation orientée objet PHP et comment $thisse comporte en fonction du contexte. https://www.php.net/manual/en/language.oop5.basic.php

Eric Leschinski
la source
Excellente explication. Je voudrais juste ajouter que $ this peut être traité comme un pseudo objet / variable qui permet d'accéder aux propriétés de la classe courante.
S.Alvi
17

Je connais sa vieille question, en tout cas une autre explication exacte à ce sujet . $ this est principalement utilisé pour référencer les propriétés d'une classe.

Exemple:

Class A
{
   public $myname;    //this is a member variable of this class

function callme() {
    $myname = 'function variable';
    $this->myname = 'Member variable';
    echo $myname;                  //prints function variable
    echo $this->myname;              //prints member variable
   }
}

production:

function variable

member variable
Loyola
la source
9

C'est le moyen de référencer une instance d'une classe à partir de lui-même, comme beaucoup d'autres langages orientés objet.

À partir de la documentation PHP :

La pseudo-variable $ this est disponible lorsqu'une méthode est appelée à partir d'un contexte d'objet. $ ceci est une référence à l'objet appelant (généralement l'objet auquel appartient la méthode, mais éventuellement un autre objet, si la méthode est appelée statiquement depuis le contexte d'un objet secondaire).

ricaner
la source
7

Voyons ce qui se passe si nous n'utilisons pas $ this et essayons d'avoir des variables d'instance et des arguments de constructeur avec le même nom avec l'extrait de code suivant

<?php

class Student {
    public $name;

    function __construct( $name ) {
        $name = $name;
    }
};

$tom = new Student('Tom');
echo $tom->name;

?>

Il ne fait écho que

<?php

class Student {
    public $name;

    function __construct( $name ) {
        $this->name = $name; // Using 'this' to access the student's name
    }
};

$tom = new Student('Tom');
echo $tom->name;

?>

cela fait écho à 'Tom'

user6485832
la source
2
Vos extraits de code sont exactement les mêmes ou est-ce que je manque quelque chose?
Demento
@Demento: oui. Je l'ai corrigé, en utilisant $thisdans le deuxième constructeur.
Axel Guilmin
Pourriez-vous expliquer pourquoi name = $ name ne me permettra pas d'accéder au nom de l'élève? Cela n'a pas de sens pour moi.
Marco Floriano
Mario, c'est à cause de la portée. à l'intérieur de la fonction se $nametrouve Tom, mais à l'extérieur de la fonction, il n'a aucune valeur, car sa portée est limitée à celle de la fonction.
dearsina
4

lorsque vous créez une classe, vous avez (dans de nombreux cas) des variables d'instance et des méthodes (aka. fonctions). $ this accède à ces variables d'instance afin que vos fonctions puissent prendre ces variables et faire ce dont elles ont besoin pour faire ce que vous voulez avec elles.

une autre version de l'exemple de meder:

class Person {

    protected $name;  //can't be accessed from outside the class

    public function __construct($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}
// this line creates an instance of the class Person setting "Jack" as $name.  
// __construct() gets executed when you declare it within the class.
$jack = new Person("Jack"); 

echo $jack->getName();

Output:

Jack
cp3
la source
3

$thisest une référence à l'objet appelant (généralement l'objet auquel appartient la méthode, mais éventuellement un autre objet, si la méthode est appelée statiquement depuis le contexte d'un objet secondaire).

Seyedan
la source
2

$ ceci est une variable spéciale et fait référence au même objet ie. lui-même.

il fait en fait référence à l'instance de la classe actuelle

voici un exemple qui effacera la déclaration ci-dessus

<?php
 class Books {
  /* Member variables */
  var $price;
  var $title;

  /* Member functions */
  function setPrice($par){
     $this->price = $par;
  }

  function getPrice(){
     echo $this->price ."<br/>";
  }

  function setTitle($par){
     $this->title = $par;
  }

  function getTitle(){
     echo $this->title ." <br/>";
  }
}
?> 
homi
la source
s'il vous plaît élaborer un peu plus
Neeraj Rathod
2

C'est une longue explication détaillée. J'espère que cela aidera les débutants. Je vais le rendre très simple.

Tout d'abord, créons une classe

<?php 

class Class1
{
    
}

Vous pouvez omettre la balise de fermeture php ?>si vous utilisez uniquement du code php.

Ajoutons maintenant des propriétés et une méthode à l'intérieur Class1.

<?php 

class Class1
{
    public $property1 = "I am property 1";
    public $property2 = "I am property 2";

    public function Method1()
    {
        return "I am Method 1";
    }
}

La propriété n'est qu'une simple variable, mais nous lui donnons le nom de propriété parce qu'elle est à l'intérieur d'une classe.

La méthode est juste une fonction simple, mais nous disons que la méthode est également à l'intérieur d'une classe.

Le publicmot-clé signifie que la méthode ou une propriété est accessible n'importe où dans le script.

Maintenant, comment pouvons-nous utiliser les propriétés et la méthode à l'intérieur Class1?

La réponse est de créer une instance ou un objet, pensez à un objet comme une copie de la classe.

<?php 

class Class1
{
    public $property1 = "I am property 1";
    public $property2 = "I am property 2";

    public function Method1()
    {
        return "I am Method 1";
    }
}

$object1 = new Class1;
var_dump($object1);

Nous avons créé un objet, qui est $object1, qui est une copie de Class1avec tout son contenu. Et nous avons vidé tout le contenu de l' $object1utilisation var_dump().

Cela vous donnera

object(Class1)#1 (2) { ["property1"]=> string(15) "I am property 1" ["property2"]=> string(15) "I am property 2" }

Donc, tout le contenu de Class1est dans $object1, sauf Method1, je ne sais pas pourquoi les méthodes ne s'affichent pas lors du vidage d'objets.

Maintenant, que faire si nous voulons accéder $property1uniquement. C'est simple, nous le faisons var_dump($object1->property1);, nous venons d'ajouter ->property1, nous l'avons souligné.

nous pouvons également accéder Method1(), nous le faisons var_dump($object1->Method1());.

Supposons maintenant que je veuille accéder $property1de l'intérieur Method1(), je vais le faire

<?php 

class Class1
{
    public $property1 = "I am property 1";
    public $property2 = "I am property 2";

    public function Method1()
    {   
        $object2 = new Class1;
        return $object2->property1;
    }
}

$object1 = new Class1;
var_dump($object1->Method1()); 

nous avons créé $object2 = new Class1;qui est une nouvelle copie de Class1ou nous pouvons dire une instance. Ensuite, nous avons souligné property1de$object2

return $object2->property1;

Cela s'imprimera string(15) "I am property 1"dans le navigateur.

Maintenant au lieu de faire ça à l'intérieur Method1()

$object2 = new Class1;
return $object2->property1;

On fait ça

return $this->property1;

L' $thisobjet est utilisé à l'intérieur de la classe pour faire référence à la classe elle-même.

C'est une alternative pour créer un nouvel objet puis le renvoyer comme ceci

$object2 = new Class1;
return $object2->property1;

Un autre exemple

<?php 

class Class1
{
    public $property1 = 119;
    public $property2 = 666;
    public $result;

    public function Method1()
    {   
        $this->result = $this->property1 + $this->property2;
        return $this->result;
    }
}

$object1 = new Class1;
var_dump($object1->Method1());

Nous avons créé 2 propriétés contenant des entiers, puis nous les avons ajoutées et avons mis le résultat dans $this->result.

N'oublie pas ça

$this->property1= $property1=119

ils ont la même valeur .. etc.

J'espère que cela explique l'idée.

Cette série de vidéos vous aidera beaucoup en POO

https://www.youtube.com/playlist?list=PLe30vg_FG4OSEHH6bRF8FrA7wmoAMUZLv

DarkReverser
la source
1

Il fait référence à l'instance de la classe actuelle, comme l' a dit meder .

Consultez la documentation PHP . C'est expliqué dans le premier exemple.

Marc W
la source