O que a variável $ this significa em PHP?


103

Eu vejo a variável $thisem PHP o tempo todo e não tenho ideia para que ela é usada. Eu nunca usei pessoalmente.

Alguém pode me dizer como $thisfunciona a variável em PHP?

Respostas:


130

É uma referência ao objeto atual, é mais comumente usado em código orientado a objetos.

Exemplo:

<?php
class Person {
    public $name;

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

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

Isso armazena a string 'Jack' como uma propriedade do objeto criado.


1
Vi um exemplo de código semelhante no tutorial KillerPHP OOP :) killerphp.com/tutorials/php-objects-page-1
Edson

Explicação agradável e fácil. @meder omuraliev
Torta de

40

A melhor maneira de aprender sobre a $thisvariável em PHP é testá-la no interpretador em vários contextos:

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

Portanto, a $thispseudo-variável tem os métodos e propriedades do Objeto Atual. Isso é útil porque permite acessar todas as variáveis ​​de membro e métodos de membro dentro da classe. Por exemplo:

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é uma referência a um PHP Objectque foi criado pelo interpretador para você, que contém um array de variáveis.

Se você chamar $thisdentro de um método normal em uma classe normal, $thisretorna o Object (a classe) à qual esse método pertence.

É possível $thisser indefinido se o contexto não tiver um objeto pai.

php.net tem uma grande página falando sobre programação PHP orientada a objetos e como $thisse comporta dependendo do contexto. https://www.php.net/manual/en/language.oop5.basic.php


Ótima explicação. Gostaria apenas de acrescentar que $ this pode ser tratado como um pseudo-objeto / variável que ajuda a acessar as propriedades da classe atual.
S.Alvi

17

Eu conheço sua velha questão, de qualquer maneira outra explicação exata sobre $ this . $ this é usado principalmente para se referir a propriedades de uma classe.

Exemplo:

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

resultado:

function variable

member variable

9

É a forma de referenciar uma instância de uma classe de dentro dela mesma, da mesma forma que muitas outras linguagens orientadas a objetos.

Dos documentos PHP :

A pseudo-variável $ this está disponível quando um método é chamado de dentro de um contexto de objeto. $ this é uma referência ao objeto de chamada (normalmente o objeto ao qual o método pertence, mas possivelmente outro objeto, se o método for chamado estaticamente a partir do contexto de um objeto secundário).


7

Vamos ver o que acontece se não usarmos $ this e tentarmos ter variáveis ​​de instância e argumentos de construtor com o mesmo nome com o seguinte trecho de código

<?php

class Student {
    public $name;

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

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

?>

Não ecoa nada além

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

?>

isso ecoa 'Tom'


2
Seus trechos de código são exatamente os mesmos ou estou faltando alguma coisa?
Demento

@Demento: sim. Eu consertei, usando $thisno segundo construtor.
Axel Guilmin

Você se importaria de explicar por que name = $ name não me permite acessar o nome do aluno? Não faz sentido para mim.
Marco Floriano

Mario, é por causa do escopo. dentro da função $nameestá Tom, mas fora da função não tem nenhum valor, pois seu escopo é limitado ao da função.
dearsina

4

quando você cria uma classe, você tem (em muitos casos) variáveis ​​de instância e métodos (também conhecidos como funções). $ this acessa essas variáveis ​​de instância para que suas funções possam pegar essas variáveis ​​e fazer o que precisam para fazer o que você quiser com elas.

outra versão do exemplo de 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


2

$ esta é uma variável especial e se refere ao mesmo objeto, ou seja. em si.

ele realmente se refere à instância da classe atual

aqui está um exemplo que irá limpar a declaração acima

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

por favor elabore um pouco mais
Neeraj Rathod

2

Esta é uma explicação longa e detalhada. Espero que isso ajude os iniciantes. Vou tornar isso muito simples.

Primeiro, vamos criar uma classe

<?php 

class Class1
{
    
}

Você pode omitir a tag de fechamento php ?>se estiver usando apenas código php.

Agora vamos adicionar propriedades e um método dentro Class1.

<?php 

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

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

A propriedade é apenas uma variável simples, mas damos a ela o nome de propriedade porque ela está dentro de uma classe.

O método é apenas uma função simples, mas dizemos método porque ele também está dentro de uma classe.

A publicpalavra-chave significa que o método ou uma propriedade pode ser acessada em qualquer lugar no script.

Agora, como podemos usar as propriedades e o método interno Class1?

A resposta é criar uma instância ou um objeto, pense em um objeto como uma cópia da classe.

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

Criamos um objeto, que $object1é uma cópia de Class1todo o seu conteúdo. E despejamos todo o conteúdo do $object1uso var_dump().

Isso vai te dar

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

Portanto, todo o conteúdo de Class1está dentro $object1, exceto Method1, não sei por que os métodos não aparecem durante o despejo de objetos.

Agora, e se quisermos $property1apenas acessar . É simples, fazemos var_dump($object1->property1);, acabamos de adicionar ->property1, apontamos para ele.

também podemos acessar Method1(), nós fazemos var_dump($object1->Method1());.

Agora, suponha que eu queira acessar $property1de dentro Method1(), farei isso

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

nós criamos $object2 = new Class1;que é uma nova cópia de Class1ou podemos dizer uma instância. Então apontamos para property1de$object2

return $object2->property1;

Isso será impresso string(15) "I am property 1"no navegador.

Agora, em vez de fazer isso por dentro Method1()

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

Nós fazemos isso

return $this->property1;

O $thisobjeto é usado dentro da classe para se referir à própria classe.

É uma alternativa para criar um novo objeto e depois devolvê-lo assim

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

Outro exemplo

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

Criamos 2 propriedades contendo inteiros e então os adicionamos e colocamos o resultado em $this->result.

Não esqueça isto

$this->property1= $property1=119

eles têm o mesmo valor .. etc.

Espero que isso explique a ideia.

Esta série de vídeos vai te ajudar muito em OOP

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


1

Refere-se à instância da turma atual, como disse meder .

Veja os documentos do PHP . É explicado no primeiro exemplo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.