Apa arti variabel $ this di PHP?

103

Saya melihat variabel $thisdi PHP sepanjang waktu dan saya tidak tahu untuk apa variabel itu digunakan. Saya tidak pernah secara pribadi menggunakannya.

Bisakah seseorang memberi tahu saya cara kerja variabel $thisdi PHP?

waiwai933
sumber

Jawaban:

130

Ini adalah referensi ke objek saat ini, ini paling sering digunakan dalam kode berorientasi objek.

Contoh:

<?php
class Person {
    public $name;

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

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

Ini menyimpan string 'Jack' sebagai properti dari objek yang dibuat.

meder omuraliev
sumber
1
Lihat contoh kode serupa di tutorial KillerPHP OOP :) killerphp.com/tutorials/php-objects-page-1
Edson
Penjelasan yang bagus dan mudah. @meder omuraliev
Pai
40

Cara terbaik untuk mempelajari $thisvariabel dalam PHP adalah dengan mencobanya terhadap interpreter dalam berbagai konteks:

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

Jadi $thispseudo-variabel memiliki metode dan properti Objek Saat Ini. Hal seperti itu berguna karena memungkinkan Anda mengakses semua variabel anggota dan metode anggota di dalam kelas. Sebagai contoh:

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

$thisadalah referensi ke PHP Objectyang dibuat oleh penerjemah untuk Anda, yang berisi larik variabel.

Jika Anda memanggil $thisdi dalam metode normal di kelas normal, $thismengembalikan Objek (kelas) tempat metode itu berada.

Mungkin $thissaja tidak ditentukan jika konteksnya tidak memiliki Objek induk.

php.net memiliki halaman besar yang berbicara tentang pemrograman berorientasi objek PHP dan bagaimana $thisberperilaku tergantung pada konteks. https://www.php.net/manual/en/language.oop5.basic.php

Eric Leschinski
sumber
Penjelasan yang bagus. Hanya ingin menambahkan bahwa $ this dapat diperlakukan sebagai objek / variabel semu yang membantu mengakses properti kelas saat ini.
S. Alvi
17

Saya tahu pertanyaan lamanya, lagi pula penjelasan pasti lainnya tentang $ this . $ this digunakan terutama untuk merujuk properti kelas.

Contoh:

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

keluaran:

function variable

member variable
loyola
sumber
9

Ini adalah cara untuk mereferensikan instance kelas dari dalam dirinya sendiri, sama seperti banyak bahasa berorientasi objek lainnya.

Dari dokumen PHP :

Pseudo-variable $ this tersedia ketika metode dipanggil dari dalam konteks objek. $ this adalah referensi ke objek pemanggil (biasanya objek di mana metode itu berada, tetapi mungkin objek lain, jika metode dipanggil secara statis dari konteks objek sekunder).

kekek
sumber
7

Mari kita lihat apa yang terjadi jika kita tidak menggunakan $ this dan mencoba untuk memiliki variabel instan dan argumen konstruktor dengan nama yang sama dengan potongan kode berikut

<?php

class Student {
    public $name;

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

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

?>

Itu hanya menggema

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

?>

ini menggemakan 'Tom'

pengguna6485832
sumber
2
Potongan kode Anda sama persis, atau saya melewatkan sesuatu?
Demento
@ Demento: ya. Saya memperbaikinya, menggunakan $thisdi konstruktor kedua.
Axel Guilmin
Maukah Anda menjelaskan mengapa name = $ name tidak mengizinkan saya mengakses nama siswa? Itu tidak masuk akal bagiku.
Marco Floriano
Mario, itu karena ruang lingkup. di dalam fungsi $nameadalah Tom, tetapi di luar fungsi, tidak ada nilai apa pun, karena ruang lingkupnya terbatas pada fungsi tersebut.
dearsina
4

ketika Anda membuat kelas, Anda memiliki (dalam banyak kasus) variabel dan metode instan (alias fungsi). $ this mengakses variabel instan tersebut sehingga fungsi Anda dapat mengambil variabel tersebut dan melakukan apa yang diperlukan untuk melakukan apa pun yang Anda inginkan.

versi lain dari contoh 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
sumber
3

$thisadalah referensi ke objek pemanggil (biasanya objek yang memiliki metode tersebut, tetapi mungkin objek lain, jika metode tersebut dipanggil secara statis dari konteks objek sekunder).

Seyedan
sumber
2

$ this adalah variabel khusus dan mengacu pada objek yang sama yaitu. diri.

itu sebenarnya merujuk contoh kelas saat ini

berikut adalah contoh yang akan menghapus pernyataan di atas

<?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
sumber
tolong uraikan sedikit lagi
Neeraj Rathod
2

Ini penjelasan rinci yang panjang. Saya harap ini akan membantu para pemula. Saya akan membuatnya sangat sederhana.

Pertama, mari buat kelas

<?php 

class Class1
{
    
}

Anda dapat menghilangkan tag penutup php ?>jika Anda hanya menggunakan kode php.

Sekarang mari tambahkan properti dan metode di dalamnya Class1.

<?php 

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

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

Properti hanyalah variabel sederhana, tetapi kami memberinya nama properti karena di dalam kelas.

Metode ini hanyalah sebuah fungsi sederhana, tetapi kami mengatakan metode karena itu juga di dalam kelas.

Kata publickunci berarti bahwa metode atau properti dapat diakses di mana saja dalam skrip.

Sekarang, bagaimana kita dapat menggunakan properti dan metode di dalamnya Class1?

Jawabannya adalah membuat sebuah instance atau sebuah objek, anggaplah sebuah objek sebagai salinan kelas.

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

Kami membuat sebuah objek, yang merupakan $object1salinan dari Class1semua isinya. Dan kami membuang semua konten yang $object1digunakan var_dump().

Ini akan memberimu

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

Jadi semua konten Class1ada di dalam $object1, kecuali Method1, saya tidak tahu mengapa metode tidak muncul saat membuang objek.

Sekarang bagaimana jika kita ingin mengakses $property1saja. Sederhana saja, kami lakukan var_dump($object1->property1);, kami baru saja menambahkan ->property1, kami menunjuk ke sana.

kami juga dapat mengakses Method1(), kami melakukannya var_dump($object1->Method1());.

Sekarang misalkan saya ingin mengakses $property1dari dalam Method1(), saya akan melakukan ini

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

kami buat $object2 = new Class1;yang merupakan salinan baru Class1atau kami dapat mengatakan sebuah contoh. Lalu kami menunjuk property1dari$object2

return $object2->property1;

Ini akan dicetak string(15) "I am property 1"di browser.

Sekarang alih-alih melakukan ini di dalam Method1()

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

Kami melakukan ini

return $this->property1;

The $thisobjek digunakan di dalam kelas untuk merujuk pada kelas itu sendiri.

Ini adalah alternatif untuk membuat objek baru dan kemudian mengembalikannya seperti ini

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

Contoh lain

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

Kami membuat 2 properti yang berisi bilangan bulat dan kemudian kami menambahkannya dan memasukkan hasilnya $this->result.

Jangan lupakan itu

$this->property1= $property1=119

mereka memiliki nilai yang sama .. dll

Saya harap itu menjelaskan idenya.

Rangkaian video ini akan banyak membantu Anda dalam OOP

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

DarkReverser
sumber
1

Ini mengacu pada instance dari kelas saat ini, seperti yang dikatakan meder .

Lihat Dokumen PHP . Ini dijelaskan di bawah contoh pertama.

Marc W.
sumber