Що означає змінна $ це в PHP?


103

Я постійно бачу змінну $thisв PHP і поняття не маю, для чого вона використовується. Я ніколи особисто не використовував це.

Хтось може сказати мені, як $thisпрацює змінна в PHP?

Відповіді:


130

Це посилання на поточний об'єкт, він найчастіше використовується в об'єктно-орієнтованому коді.

Приклад:

<?php
class Person {
    public $name;

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

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

Це зберігає рядок "Джек" як властивість створеного об'єкта.


1
Побачив подібний приклад коду в навчальному посібнику KillerPHP OOP :) killerphp.com/tutorials/php-objects-page-1
Едсон

Приємне і просте пояснення. @meder omuraliev
Pie

40

Найкращий спосіб дізнатися про $thisзмінну в PHP - це спробувати її проти інтерпретатора в різних контекстах:

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

Отже, $thisпсевдо-змінна має метод та властивості поточного об'єкта. Така річ корисна, оскільки дозволяє отримувати доступ до всіх змінних членів та методів членів всередині класу. Наприклад:

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

$this- це посилання на PHP Object, створений для вас інтерпретатором, що містить масив змінних.

Якщо ви викликаєте $thisвсередині звичайного методу в звичайному класі, $thisповертає Об'єкт (клас), до якого цей метод належить.

Не можна $thisвизначити, якщо в контексті немає батьківського Об'єкта.

php.net має велику сторінку, де розповідається про об'єктно-орієнтоване програмування PHP та про те, як $thisповодиться залежно від контексту. https://www.php.net/manual/en/language.oop5.basic.php


Чудове пояснення. Просто хочеться додати, що $ це може трактуватися як псевдооб'єкт / змінна, що допомагає отримати доступ до властивостей поточного класу.
S.Alvi

17

Я знаю його давнє запитання, інакше ще одне точне пояснення щодо $ цього . $ це в основному використовується для позначення властивостей класу.

Приклад:

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

вихід:

function variable

member variable

9

Це спосіб посилання на екземпляр класу всередині себе, як і багато інших мов, орієнтованих на об'єкти.

З документів PHP :

Псевдо-змінна $ це доступна, коли метод викликається з контексту об'єкта. $ це посилання на викликає об'єкт (як правило, на об'єкт, до якого належить метод, але можливо інший об'єкт, якщо метод викликається статично з контексту вторинного об'єкта).


7

Давайте подивимося, що станеться, якщо ми не будемо використовувати $ this і спробуємо мати змінні екземпляри та аргументи конструктора з тим самим іменем із наступним фрагментом коду

<?php

class Student {
    public $name;

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

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

?>

Це відлуння нічого, окрім

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

?>

це перегукується з "Томом"


2
Ваші фрагменти коду є абсолютно однаковими, чи я щось пропускаю?
Дементо

@Demento: так. Я зафіксував це, використовуючи $thisу другому конструкторі.
Аксель Гільмін

Не хотіли б пояснити, чому name = $ name не дозволяють мені отримати ім'я студента? Для мене це не має сенсу.
Марко Флоріано

Маріо, це через розмах. всередині функції $nameзнаходиться Том, але поза функцією воно не має жодного значення, оскільки його обсяг обмежений обсягом функції.
деарсіна

4

коли ви створюєте клас, у вас є (у багатьох випадках) змінні та методи екземплярів (ака. функції). $ this отримує доступ до цих змінних примірників, щоб ваші функції могли приймати ці змінні і робити все, що потрібно, щоб робити з ними все, що завгодно.

інша версія прикладу Медера:

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

$ це спеціальна змінна, і вона посилається на той самий об'єкт, тобто. себе.

він фактично посилається на екземпляр поточного класу

ось приклад, який очистить вищезгадане твердження

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

будь ласка, докладіть це трохи більше
Neeraj Rathod

2

Це довге детальне пояснення. Сподіваюся, це допоможе новачкам. Я зроблю це дуже просто.

Спочатку давайте створимо клас

<?php 

class Class1
{
    
}

Ви можете опустити тег закриття php, ?>якщо ви використовуєте лише код php.

Тепер додамо всередину властивості та метод Class1.

<?php 

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

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

Властивість - це просто проста змінна, але ми даємо їй властивість імені, оскільки це всередині класу.

Метод - це просто проста функція, але ми говоримо, що метод має його також всередині класу.

publicКлючове слово означає , що метод або властивість можна отримати в будь-якому місці скрипта.

Тепер, як ми можемо використовувати властивості та метод всередині Class1?

Відповідь - це створення екземпляра або об'єкта, уявлення про об'єкт як про копію класу.

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

Ми створили об'єкт, який є $object1копією Class1з усім його вмістом. І ми скинули весь вміст$object1 використання var_dump().

Це вам дасть

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

Отже весь вміст Class1у$object1 , за винятком того Method1, я не знаю, чому методи не відображаються під час скидання об'єктів.

А що робити, якщо ми хочемо $property1лише отримати доступ . Його просто, ми робимоvar_dump($object1->property1); , ми лише додали ->property1, ми вказали на це.

ми також можемо отримати доступ Method1() , ми робимо var_dump($object1->Method1());.

Тепер припустимо, що я хочу отримати доступ $property1зсередини Method1(), я зроблю це

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

ми створили, $object2 = new Class1;що є новою копією екземпляра, Class1або ми можемо сказати. Тоді ми вказали на property1с$object2

return $object2->property1;

Це надрукується string(15) "I am property 1" у браузері.

Тепер замість цього робити всередині Method1()

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

Ми робимо це

return $this->property1;

The $thisОб'єкт використовується всередині класу для позначення самого класу.

Це альтернатива для створення нового об’єкта, а потім його повернення таким чином

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

Ще один приклад

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

Ми створили 2 властивості, що містять цілі числа, а потім додали їх і поставили результат $this->result .

Не забувайте цього

$this->property1= $property1=119

вони мають таке саме значення .. тощо

Я сподіваюся, що це пояснює ідею.

Ця серія відео дуже допоможе вам в OOP

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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.