Что означает переменная $ this в PHP?

103

Я $thisвсе время вижу переменную в PHP и понятия не имею, для чего она используется. Никогда лично не пользовался.

Может кто-нибудь сказать мне, как переменная $thisработает в PHP?

waiwai933
источник

Ответы:

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
Пирог
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

Эрик Лещинский
источник
Отличное объяснение. Просто хочу добавить, что $ this можно рассматривать как псевдообъект / переменную, которая помогает получить доступ к свойствам текущего класса.
S.Alvi
17

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

Пример:

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 :

Псевдопеременная $ this доступна, когда метод вызывается из контекста объекта. $ this - это ссылка на вызывающий объект (обычно это объект, которому принадлежит метод, но, возможно, другой объект, если метод вызывается статически из контекста вторичного объекта).

хихикать
источник
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;

?>

это перекликается с "Томом"

user6485832
источник
2
Ваши фрагменты кода абсолютно одинаковы, или мне что-то не хватает?
Demento
@ Дементо: да. Я исправил это, используя $thisво втором конструкторе.
Axel Guilmin
Не могли бы вы объяснить, почему 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
cp3
источник
3

$thisявляется ссылкой на вызывающий объект (обычно объект, которому принадлежит метод, но, возможно, другой объект, если метод вызывается статически из контекста вторичного объекта).

Сейедан
источник
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всего его содержимого. И мы сбросили все содержимое $object1using 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;

$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

у них такая же ценность и т. д.

Надеюсь, это объясняет идею.

Эта серия видео очень поможет вам в ООП

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

ТемныйРеверсер
источник
1

Как сказал Медер, это относится к экземпляру текущего класса .

См. Документацию PHP . Это объясняется в первом примере.

Марк В
источник