$ This değişkeni PHP'de ne anlama geliyor?


103

Değişkeni $thisPHP'de her zaman görüyorum ve ne için kullanıldığı hakkında hiçbir fikrim yok. Ben şahsen hiç kullanmadım.

Birisi bana değişkenin $thisPHP'de nasıl çalıştığını söyleyebilir mi?

Yanıtlar:


130

Mevcut nesneye bir referanstır, en çok nesne yönelimli kodda kullanılır.

Misal:

<?php
class Person {
    public $name;

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

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

Bu, 'Jack' dizesini oluşturulan nesnenin bir özelliği olarak depolar.


1
KillerPHP OOP öğreticisinde benzer örnek kodu gördüm :) killerphp.com/tutorials/php-objects-page-1
Edson

Güzel ve kolay açıklama. @meder omuraliev
Pie

40

$thisPHP'deki değişken hakkında bilgi edinmenin en iyi yolu, onu çeşitli bağlamlarda yorumlayıcıya karşı denemektir:

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

Dolayısıyla $thissözde değişken, Mevcut Nesnenin yöntemine ve özelliklerine sahiptir. Böyle bir şey kullanışlıdır çünkü sınıf içindeki tüm üye değişkenlere ve üye yöntemlerine erişmenize izin verir. Örneğin:

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

$thisObjectyorumlayıcı tarafından sizin için oluşturulmuş, değişkenler dizisi içeren bir PHP'ye referanstır .

$thisNormal bir sınıfta normal bir yöntemin içinde arama yaparsanız , $thiso yöntemin ait olduğu Object'i (sınıf) döndürür.

$thisBağlamın üst Nesnesi yoksa tanımsız olması mümkündür .

php.net, PHP nesne yönelimli programlama ve $thisbağlama bağlı olarak nasıl davranacağı hakkında büyük bir sayfaya sahiptir . https://www.php.net/manual/en/language.oop5.basic.php


Harika açıklama. Sadece $ this 'in sözde nesne / değişken olarak ele alınabileceğini ve mevcut sınıfın özelliklerine erişmeye yardımcı olduğunu eklemek isterim.
S.Alvi

17

Eski sorusunu biliyorum, yine de $ this hakkında başka bir kesin açıklama . $ bu , esas olarak bir sınıfın özelliklerini belirtmek için kullanılır.

Misal:

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

çıktı:

function variable

member variable

9

Bu, diğer birçok nesne yönelimli dilde olduğu gibi, kendi içinden bir sınıfın bir örneğine gönderme yapmanın yoludur.

Gönderen PHP docs :

Sözde değişken $ this, bir yöntem bir nesne bağlamından çağrıldığında kullanılabilir. $ bu, çağıran nesneye bir referanstır (genellikle yöntemin ait olduğu nesne, ancak yöntem ikincil bir nesnenin bağlamından statik olarak çağrılmışsa muhtemelen başka bir nesne).


7

$ This kullanmazsak ve aşağıdaki kod parçacığı ile aynı ada sahip örnek değişkenleri ve yapıcı argümanları sağlamaya çalışırsak ne olacağını görelim.

<?php

class Student {
    public $name;

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

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

?>

Yankılanmıyor ama

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

?>

bu 'Tom' yankılanıyor


2
Kod parçacıklarınız tamamen aynı mı yoksa bir şey mi kaçırıyorum?
Demento

@Demento: evet. $thisİkinci kurucuda kullanarak onu düzelttim .
Axel Guilmin

Name = $ name neden öğrencinin adına erişmeme izin vermediğini açıklayabilir misin? Bana mantıklı gelmiyor.
Marco Floriano

Mario, kapsam nedeniyle. işlevin içi $nameTom'dur, ancak işlevin dışında herhangi bir değeri yoktur, çünkü kapsamı işlevin kapsamı ile sınırlıdır.
sevgili

4

Bir sınıf oluşturduğunuzda (çoğu durumda) örnek değişkenleriniz ve yöntemleriniz (diğer adıyla işlevler) vardır. $ this, bu örnek değişkenlerine erişir, böylece işlevleriniz bu değişkenleri alabilir ve onlarla istediğinizi yapmak için ihtiyaç duydukları şeyi yapabilir.

meder örneğinin başka bir versiyonu:

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

$ bu özel bir değişkendir ve aynı nesneye, yani. kendisi.

aslında mevcut sınıfın örneğini ifade eder

işte yukarıdaki ifadeyi temizleyecek bir örnek

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

lütfen biraz daha detaylandırın
Neeraj Rathod

2

Bu uzun ayrıntılı bir açıklamadır. Umarım bu yeni başlayanlara yardımcı olur. Bunu çok basitleştireceğim.

Önce bir sınıf oluşturalım

<?php 

class Class1
{
    
}

Sadece ?>php kodunu kullanıyorsanız , php kapanış etiketini atlayabilirsiniz .

Şimdi içerisine özellikler ve bir yöntem ekleyelim Class1.

<?php 

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

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

Özellik sadece basit bir değişkendir, ancak ona bir sınıfın içinde olduğu için özellik adını veriyoruz.

Yöntem sadece basit bir işlevdir, ancak yöntemin de bir sınıf içinde olduğunu söylüyoruz.

publicYöntem veya özellik her yerdeki komut ulaşılabilir anlamına anahtar sözcük.

Şimdi, içindeki özellikleri ve yöntemi nasıl kullanabiliriz Class1?

Cevap, bir örnek veya nesne oluşturmaktır, bir nesneyi sınıfın bir kopyası olarak düşünün.

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

Tüm içeriği ile $object1kopyası olan bir nesne yarattık Class1. Ve biz tüm içeriğini dökülüyor $object1kullanarak var_dump().

Bu sana verecek

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

Tüm içerikleri Yani Class1içindedir $object1hariç, Method1i nesneleri damping ederken yöntemleri göstermiyor neden bilmiyorum.

Şimdi ya $property1sadece erişmek istiyorsak . Çok basit, yaptık var_dump($object1->property1);, yeni ekledik ->property1, işaret ettik.

biz de erişebiliriz Method1(), yaparız var_dump($object1->Method1());.

Şimdi $property1içeriden erişmek istediğimi varsayalım Method1(), bunu yapacağım

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

Yarattığımız $object2 = new Class1;yeni bir kopyasını olan Class1ya da biz bir örneğini söyleyebiliriz. Sonra işaret property1dan$object2

return $object2->property1;

Bu string(15) "I am property 1"tarayıcıda yazdırılacaktır .

Şimdi bunu içeride yapmak yerine Method1()

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

Biz bunu yaparız

return $this->property1;

$thisNesne sınıfının kendisine atıfta sınıf içinde kullanılır.

Yeni bir nesne oluşturmak ve sonra onu bu şekilde döndürmek için bir alternatiftir

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

Başka bir örnek

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

Tam sayı içeren 2 özellik oluşturduk ve sonra bunları ekleyip sonucu koyduk $this->result.

Bunu unutma

$this->property1= $property1=119

aynı değere sahipler .. vb

Umarım bu fikri açıklar.

Bu video dizisi size OOP konusunda çok yardımcı olacak

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


1

Meder'in dediği gibi, mevcut sınıfın örneğini ifade eder .

PHP Belgelerine bakın . İlk örnek altında açıklanmıştır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.