Was bedeutet die Variable $ this in PHP?


103

Ich sehe die Variable die $thisganze Zeit in PHP und ich habe keine Ahnung, wofür sie verwendet wird. Ich habe es nie persönlich benutzt.

Kann mir jemand sagen, wie die Variable $thisin PHP funktioniert?

Antworten:


130

Es ist eine Referenz auf das aktuelle Objekt und wird am häufigsten in objektorientiertem Code verwendet.

Beispiel:

<?php
class Person {
    public $name;

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

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

Dadurch wird die Zeichenfolge 'Jack' als Eigenschaft des erstellten Objekts gespeichert.


1
Sah ähnlichen Beispielcode im KillerPHP OOP Tutorial :) Killerphp.com/tutorials/php-objects-page-1
Edson

Schöne und einfache Erklärung. @ Meder Omuraliev
Pie

40

Der beste Weg, um mehr über die $thisVariable in PHP zu erfahren, besteht darin, sie in verschiedenen Kontexten gegen den Interpreter zu testen:

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 ->

Die $thisPseudovariable hat also die Methoden und Eigenschaften des aktuellen Objekts. So etwas ist nützlich, weil Sie damit auf alle Mitgliedsvariablen und Mitgliedsmethoden innerhalb der Klasse zugreifen können. Beispielsweise:

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;
    }
}

$thisist ein Verweis auf ein PHP Object, das vom Interpreter für Sie erstellt wurde und ein Array von Variablen enthält.

Wenn Sie $thisinnerhalb einer normalen Methode in einer normalen Klasse aufrufen , wird $thisdas Objekt (die Klasse) zurückgegeben, zu dem diese Methode gehört.

Es ist möglich $this, undefiniert zu sein, wenn der Kontext kein übergeordnetes Objekt hat.

php.net hat eine große Seite, die über objektorientierte PHP-Programmierung und das Verhalten $thisje nach Kontext spricht . https://www.php.net/manual/en/language.oop5.basic.php


Tolle Erklärung. Ich möchte nur hinzufügen, dass $ this als Pseudoobjekt / -variable behandelt werden kann, die den Zugriff auf die Eigenschaften der aktuellen Klasse erleichtert.
Alvi

17

Ich kenne seine alte Frage, jedenfalls eine weitere genaue Erklärung dazu . $ Dies wird hauptsächlich verwendet, um Eigenschaften einer Klasse zu referenzieren.

Beispiel:

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
   }
}

Ausgabe:

function variable

member variable

9

Dies ist die Möglichkeit, eine Instanz einer Klasse aus sich heraus zu referenzieren, genau wie viele andere objektorientierte Sprachen.

Aus den PHP-Dokumenten :

Die Pseudovariable $ this ist verfügbar, wenn eine Methode aus einem Objektkontext heraus aufgerufen wird. $ Dies ist eine Referenz auf das aufrufende Objekt (normalerweise das Objekt, zu dem die Methode gehört, aber möglicherweise ein anderes Objekt, wenn die Methode statisch aus dem Kontext eines sekundären Objekts aufgerufen wird).


7

Mal sehen, was passiert, wenn wir $ this nicht verwenden und versuchen, Instanzvariablen und Konstruktorargumente mit demselben Namen mit dem folgenden Codeausschnitt zu haben

<?php

class Student {
    public $name;

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

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

?>

Es hallt nichts als

<?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;

?>

dies spiegelt "Tom" wider


2
Ihre Codefragmente sind beide genau gleich, oder fehlt mir etwas?
Demento

@Demento: ja. Ich habe es mit $thisdem zweiten Konstruktor behoben .
Axel Guilmin

Würde es Ihnen etwas ausmachen zu erklären, warum name = $ name mir nicht erlaubt, auf den Namen des Schülers zuzugreifen? Das ergibt für mich keinen Sinn.
Marco Floriano

Mario, es liegt am Umfang. Innerhalb der Funktion $namebefindet sich Tom, außerhalb der Funktion hat sie jedoch keinen Wert, da ihr Umfang auf den der Funktion beschränkt ist.
Dearsina

4

Wenn Sie eine Klasse erstellen, haben Sie (in vielen Fällen) Instanzvariablen und -methoden (auch bekannt als. Funktionen). $ this greift auf diese Instanzvariablen zu, damit Ihre Funktionen diese Variablen übernehmen und das tun können, was sie benötigen, um mit ihnen zu tun, was Sie wollen.

eine andere Version von Meders Beispiel:

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


2

$ Dies ist eine spezielle Variable und bezieht sich auf dasselbe Objekt, dh. selbst.

es verweist tatsächlich auf eine Instanz der aktuellen Klasse

Hier ist ein Beispiel, das die obige Aussage verdeutlicht

<?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/>";
  }
}
?> 

Bitte erläutern Sie es etwas mehr
Neeraj Rathod

2

Dies ist eine lange ausführliche Erklärung. Ich hoffe das hilft den Anfängern. Ich werde es sehr einfach machen.

Zuerst erstellen wir eine Klasse

<?php 

class Class1
{
    
}

Sie können das PHP-Closing-Tag weglassen, ?>wenn Sie nur PHP-Code verwenden.

Fügen wir nun Eigenschaften und eine Methode hinzu Class1.

<?php 

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

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

Die Eigenschaft ist nur eine einfache Variable, aber wir geben ihr die Namenseigenschaft, da sie innerhalb einer Klasse liegt.

Die Methode ist nur eine einfache Funktion, aber wir sagen, dass die Methode auch innerhalb einer Klasse liegt.

Das publicSchlüsselwort bedeutet, dass auf die Methode oder eine Eigenschaft an einer beliebigen Stelle im Skript zugegriffen werden kann.

Wie können wir nun die Eigenschaften und die Methode im Inneren verwenden Class1?

Die Antwort ist das Erstellen einer Instanz oder eines Objekts. Stellen Sie sich ein Objekt als Kopie der Klasse vor.

<?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);

Wir haben ein Objekt erstellt, das $object1eine Kopie Class1mit allen Inhalten ist. Und wir haben den gesamten Inhalt der $object1Verwendung abgeladen var_dump().

Das wird dir geben

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

Der gesamte Inhalt von Class1ist in $object1, außer Method1ich weiß nicht, warum Methoden beim Dumping von Objekten nicht angezeigt werden.

Was ist nun, wenn wir $property1nur darauf zugreifen möchten? Es ist einfach, wir tun es var_dump($object1->property1);, wir haben gerade hinzugefügt ->property1, wir haben darauf hingewiesen.

wir können auch den Zugang Method1(), was wir tun var_dump($object1->Method1());.

Angenommen, ich möchte $property1von innen darauf zugreifen Method1(), ich werde dies tun

<?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()); 

Wir haben $object2 = new Class1;eine neue Kopie erstellt Class1oder wir können eine Instanz sagen. Dann zeigten wir auf property1von$object2

return $object2->property1;

Dies wird string(15) "I am property 1"im Browser gedruckt .

Jetzt anstatt dies drinnen zu tun Method1()

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

Wir machen das

return $this->property1;

Das $thisObjekt wird innerhalb der Klasse verwendet, um auf die Klasse selbst zu verweisen.

Es ist eine Alternative, um ein neues Objekt zu erstellen und es dann so zurückzugeben

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

Ein anderes Beispiel

<?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());

Wir haben 2 Eigenschaften mit ganzen Zahlen erstellt und diese dann hinzugefügt und das Ergebnis eingegeben $this->result.

Vergiss das nicht

$this->property1= $property1=119

sie haben den gleichen Wert .. etc.

Ich hoffe das erklärt die Idee.

Diese Reihe von Videos wird Ihnen in OOP sehr helfen

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


1

Es bezieht sich auf die Instanz der aktuellen Klasse, wie Meder sagte.

Siehe die PHP-Dokumente . Es wird unter dem ersten Beispiel erklärt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.