变量$ this在PHP中是什么意思?


103

$this一直都在PHP中看到该变量,但我不知道它的用途。我从来没有亲自使用过它。

有人可以告诉我该变量$this在PHP中如何工作吗?

Answers:


130

它是对当前对象的引用,在面向对象的代码中最常用。

例:

<?php
class Person {
    public $name;

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

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

这会将'Jack'字符串存储为所创建对象的属性。


1
在KillerPHP OOP教程中看到了类似的示例代码:) killerphp.com/tutorials/php-objects-page-1
Edson

很好而且很容易解释。@meder omuraliev
馅饼

40

了解$thisPHP中变量的最好方法是在各种情况下针对解释器进行尝试:

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是对Object由解释器为您创建的PHP的引用,该PHP 包含变量数组。

如果$this在普通类中的普通方法内调用,则$this返回该方法所属的Object(该类)。

$this如果上下文没有父对象,则可能是不确定的。

php.net上有一个很大的页面,讨论PHP面向对象的编程以及如何$this根据上下文运行。 https://www.php.net/manual/zh/language.oop5.basic.php


很好的解释。只是想补充一点,可以将此$ this视为伪对象/变量,以帮助访问当前类的属性。
S.Alvi '19

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;

?>

这呼应“汤姆”


2
您的代码段完全相同,还是我缺少某些内容?
Demento

@Demento:是的。我$this在第二个构造函数中使用修复了它。
Axel Guilmin

您介意解释为什么name = $ name不允许我访问学生的姓名吗?对我来说这没有意义。
Marco Floriano

马里奥,是因为范围。在函数内部$name是Tom,但在函数外部没有任何值,因为它的范围限于函数的范围。
dearsina

4

当您创建一个类时,您将拥有(在许多情况下)实例变量和方法(又称函数)。$ this访问这些实例变量,以便您的函数可以使用这些变量,并执行所需的操作以对它们进行所需的操作。

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

$ this是一个特殊变量,它指向同一对象,即。本身。

它实际上是引用当前类的实例

这是一个示例,可以清除上面的语句

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

该属性只是一个简单的变量,但我们将其名称属性cuz命名为类。

该方法只是一个简单的函数,但是我们说方法在类中也包含它。

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

我们创建了一个对象,它是$object1Class1所有内容的副本。然后我们转储了$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

他们具有相同的价值..等等

我希望这可以解释这个想法。

该系列视频将为您带来很多OOP

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


1

正如meder所说,它是指当前类的实例。

请参阅PHP Docs。在第一个示例中对此进行了解释。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.