Co oznacza zmienna $ this w PHP?


103

Widzę zmienną $thisw PHP cały czas i nie mam pojęcia, do czego jest używana. Nigdy go osobiście nie użyłem.

Czy ktoś może mi powiedzieć, jak ta zmienna $thisdziała w PHP?

Odpowiedzi:


130

Jest to odniesienie do bieżącego obiektu, jest najczęściej używane w kodzie zorientowanym obiektowo.

Przykład:

<?php
class Person {
    public $name;

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

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

Spowoduje to zapisanie ciągu „Jacka” jako właściwości utworzonego obiektu.


1
Widziałem podobny przykładowy kod w samouczku KillerPHP OOP :) killerphp.com/tutorials/php-objects-page-1
Edson

Ładne i łatwe wyjaśnienie. @meder omuraliev
Pie

40

Najlepszym sposobem na poznanie $thiszmiennej w PHP jest wypróbowanie jej przeciwko interpreterowi w różnych kontekstach:

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

Więc $thispseudozmienna ma metodę i właściwości Current Object. Taka rzecz jest przydatna, ponieważ umożliwia dostęp do wszystkich zmiennych składowych i metod składowych wewnątrz klasy. Na przykład:

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

$thisjest odniesieniem do PHP, Objectktóre zostało stworzone przez interpreter dla Ciebie, które zawiera tablicę zmiennych.

Jeśli wywołasz $thiswewnątrz zwykłej metody w normalnej klasie, $thiszwraca Object (klasę), do której należy ta metoda.

Może $thisbyć niezdefiniowane, jeśli kontekst nie ma obiektu nadrzędnego.

php.net ma dużą stronę poświęconą programowaniu obiektowemu PHP i $thiszachowaniu w zależności od kontekstu. https://www.php.net/manual/en/language.oop5.basic.php


Świetne wyjaśnienie. Chciałbym tylko dodać, że $ this może być traktowane jako pseudo obiekt / zmienna, która pomaga uzyskać dostęp do właściwości bieżącej klasy.
S.Alvi

17

Znam jego stare pytanie, w każdym razie inne dokładne wyjaśnienie dotyczące tego . $ this jest używane głównie do odwoływania się do właściwości klasy.

Przykład:

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

wynik:

function variable

member variable

9

Jest to sposób na odwołanie się do instancji klasy z jej wnętrza, tak samo jak w przypadku wielu innych języków obiektowych.

Z dokumentacji PHP :

Pseudozmienna $ this jest dostępna, gdy metoda jest wywoływana z kontekstu obiektu. $ this jest odwołaniem do obiektu wywołującego (zwykle jest to obiekt, do którego należy metoda, ale prawdopodobnie inny obiekt, jeśli metoda jest wywoływana statycznie z kontekstu drugiego obiektu).


7

Zobaczmy, co się stanie, jeśli nie użyjemy $ this i spróbujemy mieć zmienne instancji i argumenty konstruktora o tej samej nazwie z następującym fragmentem kodu

<?php

class Student {
    public $name;

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

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

?>

Nie odbija się tylko echem

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

?>

to echo „Tom”


2
Twoje fragmenty kodu są dokładnie takie same, czy czegoś mi brakuje?
Demento

@Demento: tak. Naprawiłem to, używając $thisdrugiego konstruktora.
Axel Guilmin

Czy mógłbyś wyjaśnić, dlaczego name = $ name nie pozwala mi na dostęp do nazwiska ucznia? To nie ma dla mnie sensu.
Marco Floriano

Mario, to z powodu zakresu. wewnątrz funkcji $namejest Tom, ale poza funkcją nie ma żadnej wartości, ponieważ jej zakres jest ograniczony do zakresu funkcji.
dearsina

4

kiedy tworzysz klasę, masz (w wielu przypadkach) zmienne instancji i metody (inaczej funkcje). $ this uzyskuje dostęp do tych zmiennych instancji, dzięki czemu funkcje mogą pobierać te zmienne i robić z nimi co tylko zechcesz.

inna wersja przykładu medera:

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

$ to jest zmienna specjalna i odnosi się do tego samego obiektu, tj. samo.

faktycznie odwołuje się do instancji bieżącej klasy

oto przykład, który wyjaśni powyższe stwierdzenie

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

proszę rozwinąć to trochę więcej
Neeraj Rathod,

2

To jest długie szczegółowe wyjaśnienie. Mam nadzieję, że pomoże to początkującym. Uczynię to bardzo prostym.

Najpierw utwórzmy klasę

<?php 

class Class1
{
    
}

Możesz pominąć tag zamykający php, ?>jeśli używasz tylko kodu php.

Teraz dodajmy właściwości i metodę wewnątrz Class1.

<?php 

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

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

Właściwość jest zwykłą zmienną, ale nadajemy jej nazwę property, ponieważ znajduje się wewnątrz klasy.

Metoda jest po prostu prostą funkcją, ale mówimy o metodzie, ponieważ znajduje się ona również wewnątrz klasy.

Słowo publickluczowe oznacza, że ​​dostęp do metody lub właściwości można uzyskać w dowolnym miejscu skryptu.

Teraz, jak możemy wykorzystać właściwości i metodę wewnątrz Class1?

Odpowiedzią jest utworzenie instancji lub obiektu, pomyśl o obiekcie jak o kopii klasy.

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

Stworzyliśmy obiekt, który jest $object1kopią Class1z całą zawartością. I wyrzuciliśmy całą zawartość $object1using var_dump().

To ci da

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

Więc cała zawartość Class1znajduje się w $object1, z wyjątkiem tego Method1, że nie wiem, dlaczego metody nie są wyświetlane podczas zrzucania obiektów.

A co, jeśli chcemy $property1tylko uzyskać dostęp . To proste, robimy var_dump($object1->property1);, po prostu dodaliśmy ->property1, wskazaliśmy na to.

mamy również dostęp Method1(), robimy var_dump($object1->Method1());.

Teraz przypuśćmy, że chcę uzyskać dostęp $property1od wewnątrz Method1(), zrobię to

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

stworzyliśmy, $object2 = new Class1;który jest nową kopią Class1lub możemy powiedzieć, że jest instancją. Następnie wskazaliśmy property1z$object2

return $object2->property1;

Spowoduje to wydrukowanie string(15) "I am property 1"w przeglądarce.

Teraz zamiast robić to w środku Method1()

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

My to robimy

return $this->property1;

$thisPrzedmiot jest używany wewnątrz klasy odnosi się do samej klasie.

Jest to alternatywa dla stworzenia nowego obiektu i zwrócenia go w ten sposób

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

Inny przykład

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

Stworzyliśmy 2 właściwości zawierające liczby całkowite, a następnie dodaliśmy je i wstawiliśmy wynik $this->result.

Nie zapomnij tego

$this->property1= $property1=119

mają tę samą wartość… itd

Mam nadzieję, że to wyjaśnia pomysł.

Ta seria filmów pomoże Ci bardzo w OOP

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


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.