PHP 中的变量 $this 是啥意思?

Posted

技术标签:

【中文标题】PHP 中的变量 $this 是啥意思?【英文标题】:What does the variable $this mean in PHP?PHP 中的变量 $this 是什么意思? 【发布时间】:2010-12-04 03:42:31 【问题描述】:

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

谁能告诉我变量$this在PHP中是如何工作的?

【问题讨论】:

【参考方案1】:

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

参考:http://www.php.net/manual/en/language.oop5.basic.php 入门:http://www.phpro.org/tutorials/Object-Oriented-Programming-with-PHP.html

例子:

<?php
class Person 
    public $name;

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

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

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

【讨论】:

在 KillerPHP OOP 教程中看到类似的示例代码 :) killerphp.com/tutorials/php-objects-page-1 很好很简单的解释。 @meder omuraliev【参考方案2】:

了解 PHP 中 $this 变量的最佳方法是在各种上下文中对解释器进行尝试:

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 可以被视为有助于访问当前类的属性的伪对象/变量。【参考方案3】:

我知道它的老问题,无论如何关于 $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

【讨论】:

【参考方案4】:

这是从自身内部引用类实例的方式,与许多其他面向对象的语言相同。

来自PHP docs:

伪变量 $this 可用 当从内部调用方法时 对象上下文。 $this 是一个参考 到调用对象(通常是 方法所属的对象, 但可能是另一个对象,如果 方法是从静态调用的 次要对象的上下文)。

【讨论】:

【参考方案5】:

让我们看看如果我们不使用 $this 并尝试使用实例变量和 具有相同名称的构造函数参数,代码如下:sn-p

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

?>

这与“汤姆”相呼应

【讨论】:

您的代码 sn-ps 都完全相同,还是我遗漏了什么? @Demento:是的。我修复了它,在第二个构造函数中使用了$this 您介意解释一下为什么 name = $name 不允许我访问学生的姓名吗?这对我来说没有意义。 马里奥,这是因为范围。函数内部$name是Tom,但是在函数外部,它没有任何值,因为它的作用域仅限于函数的范围。【参考方案6】:

当你创建一个类时,你(在许多情况下)拥有实例变量和方法(又名函数)。 $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

【讨论】:

【参考方案7】:

这是很长的详细解释。我希望这对初学者有帮助。我会让它变得非常简单。

首先,让我们创建一个类

<?php 

class Class1

    

如果您只使用 php 代码,则可以省略 php 结束标记 ?&gt;

现在让我们在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 及其所有内容的副本。我们使用var_dump() 转储了$object1 的所有内容。

这会给你

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-&gt;property1);,我们只是添加了-&gt;property1,我们指向它。

我们也可以访问Method1(),我们访问var_dump($object1-&gt;Method1());

现在假设我想从Method1() 内部访问$property1,我会这样做

<?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 的新副本,或者我们可以说是一个实例。然后我们从$object2指向property1

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-&gt;result

别忘了

$this-&gt;property1 = $property1 = 119

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

我希望这能解释这个想法。

这一系列视频将对您在 OOP 方面有很大帮助

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

【讨论】:

【参考方案8】:

$this 是a reference to the calling object(通常是该方法所属的对象,但也可能是另一个对象,如果该方法是从辅助对象的上下文中静态调用的)。

【讨论】:

【参考方案9】:

$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/>";
  

?> 

【讨论】:

请详细说明一下【参考方案10】:

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

请参阅PHP Docs。在第一个例子中已经解释过了。

【讨论】:

【参考方案11】:

this关键字一般用在类内部,一般用在成员函数中,为当前对象访问类的非静态成员(变量或函数)。

    此关键字前面应带有 $ 符号。 对于此运算符,我们使用 -> 符号。 而 $this 将引用特定实例的成员变量和函数。

我们通过一个例子来理解$this的用法。

<?php
class Hero 
    // first name of hero
    private $name;
    
    // public function to set value for name (setter method)
    public function setName($name) 
        $this->name = $name;
    
    
    // public function to get value of name (getter method)
    public function getName() 
        return $this->name;
    


// creating class object
$stark = new Hero();

// calling the public function to set fname
$stark->setName("IRON MAN");

// getting the value of the name variable
echo "I Am " . $stark->getName();
?>

输出: 我是钢铁侠

注意: 静态变量充当全局变量,并在类的所有对象之间共享。非静态变量特定于创建它们的实例对象。

【讨论】:

以上是关于PHP 中的变量 $this 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

php中的global关键字是啥意思

PHP的变量是啥

php的$nbsp是啥

在 PHP 中声明变量时 `<<` 是啥意思? [复制]

在php代码中 empty 是啥意思

java中的super()是啥