在PHP中,什么时候需要使用$this关键字?

9

在PHP中,什么时候需要使用$this关键字?据我所知,$this指的是在不知道对象名称的情况下创建的对象。

此外,$this关键字只能在方法内部使用?

一个示例可以很好地展示何时可以使用$this


10
面向对象编程(OOP)是一种广泛使用的编程范式,它通过将数据和操作数据的代码打包在一起来实现抽象化。在 PHP 中,您可以使用类和对象来实现 OOP。一个类是一个拥有属性(变量)和方法(函数)的结构。属性是类所包含的数据,方法是可对这些数据执行的操作。类定义了对象的状态和行为。一个对象是一个类的实例。当您创建一个对象时,您正在实例化该类。您可以通过访问对象的属性和方法来操作对象。要创建一个类,可以使用 class 关键字:class MyClass { public $myAttribute = 'default value'; public function myMethod() { echo 'Hello World!'; } }在这个例子中,我们定义了一个名为 MyClass 的类。它有一个名为 $myAttribute 的公共属性和一个名为 myMethod() 的公共方法。要实例化该类并访问其属性和方法,可以使用以下代码:$obj = new MyClass(); echo $obj->myAttribute; // 输出 "default value" $obj->myMethod(); // 输出 "Hello World!" - Your Common Sense
3
特别要注意这里的示例#2:http://php.net/manual/en/language.oop5.basic.php - RabidFire
$this 在 PHP 中不是一个关键字(而是一个伪变量),因此无法回答您的问题。 - hakre
12个回答

8

一个类可以包含它自己的常量、变量(被称为“属性”)和函数(被称为“方法”)。

<?php
class SimpleClass
{
    // property declaration
    public $var = 'a default value';

    // method declaration
    public function displayVar() {
        echo $this->var;
    }
}
?>

$this伪变量的一些示例:

<?php
class A
{
    function foo()
    {
        if (isset($this)) {
            echo '$this is defined (';
            echo get_class($this);
            echo ")\n";
        } else {
            echo "\$this is not defined.\n";
        }
    }
}

class B
{
    function bar()
    {
        // Note: the next line will issue a warning if E_STRICT is enabled.
        A::foo();
    }
}

$a = new A();
$a->foo();

// Note: the next line will issue a warning if E_STRICT is enabled.
A::foo();
$b = new B();
$b->bar();

// Note: the next line will issue a warning if E_STRICT is enabled.
B::bar();
?>

上面的例子将输出:
  • $this已定义(A)
  • $this未定义。
  • $this已定义(B)
  • $this未定义。

3
最常见的应用场景是在面向对象编程中,定义类或在类中工作。例如:
class Horse {
    var $running = false;

    function run() {
        $this->running = true;
    }
}

正如你所看到的,在run函数中,我们可以使用$this变量来引用当前实例化的Horse类。因此,需要记住的另一件事是,如果您创建了2个Horse类,每个类内部的$this变量将分别引用该特定实例化的Horse类,而不是这两个类。


2
如果您在PHP中进行面向对象编程,那么只有在创建类时才会使用$this。以下是一个例子:
class Item {
  protected $name, $price, $qty, $total;

  public function __construct($iName, $iPrice, $iQty) {
    $this->name = $iName;
    $this->price = $iPrice;
    $this->qty = $iQty;
    $this->calculate();
  }

}

谢谢!我理解了,但你会在方法之外使用 $this 吗? - Imran
正确的做法是不这样做,因为$this只在类内部有意义。在类外部,您需要使用对象,例如$a = new Item(),然后可以执行$a->methodName()。 - Amir Raminfar

2

$this用于引用当前对象的实例。因此,您可以执行以下操作:

class MyClass {
    private $name;

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

    //vs
    public function setName($pName) {
        $name = $pName;
    }
}

另一个很酷的用法是可以链接多个方法:

例如:

class MyClass2 {
    private $firstName;
    private $lastName;

    public function setFirstName($name) {
        $this->firstName = $name;
        return $this;
    }

    public function setLastName($name) {
        $this->lastName = $name;
        return $this;
    }

    public function sayHello() {
        print "Hello {$this->firstName} {$this->lastName}";
    }
}

//And now you can do:
$newInstance = new MyClass2;
$newInstance->setFirstName("John")->setLastName("Doe")->sayHello();

1

它在面向对象编程(OOP)中使用:

<?php
class Example
{  
    public function foo()
    {
        //code
    }

    public function bar()
    {
        $this->foo();
    }
}

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

1
有一次我知道我最终使用其他语言中的this等效物来实现“流畅”接口;每个类方法本来应该返回void,而是返回this,以便可以轻松地链接方法调用。
public function DoThis(){
    //Do stuff here...
    return $this;
}
public function DoThat(){
   //do other stuff here...
   return $this;
}

可以这样调用上述内容:

myObject->DoThis()->DoThat();

这对某些事情可能会有用。


你的意思是可以这样调用吗 myObject->DoThis()->DoThat() ;-)? - thedom
@thedom - 呵呵...抱歉;我很少使用PHP,几乎从不使用OOP/PHP。我会修复它的...感谢你指出那个愚蠢的错误! :) - Andrew Barber
没问题...我只是想知道怎么做而已,不再自信了 :P // 编辑...当然是 $myObject->DoThis()->DoThat() 哈哈! - thedom

1

用于当您想要使用本地变量时。

您也可以从这里了解更多相关信息。

function bark() {
    print "{$this->Name} says Woof!\n";
}

1

$this 是在你创建一个新对象实例时使用的。

例如,想象一下这个:

class Test {
    private $_hello = "hello";

    public function getHello () {
        echo $this->_hello; // note that I removed the $ from _hello !
    }

    public function setHello ($hello) {
        $this->_hello = $hello;
    }
}

为了访问 getHello 方法,我必须创建一个 Test 类的新实例,就像这样:
$obj = new Test ();
// Then, I can access to the getHello method :
echo $obj->getHello ();
// will output "hello"

$obj->setHello("lala");
echo $obj->getHello ();
// will output "lala"    

实际上,$this被用于类中实例化时,它被称为范围

在您的类内部,您使用$this(例如访问* $_hello *),但在类外部,$this不引用类内部的元素(如* $_hello *),而是$obj

现在,$obj$this之间的主要区别是,由于$obj外部访问您的类,因此会有一些限制:如果您在类中定义了某些私有受保护的内容,例如我的变量* $_hello *,$obj 无法访问它(它是私有的!)但是$this可以,因为$this在类内部。


0
无论何时你想要使用某个变量,该变量位于函数外但是在同一个类中,你需要使用 $this。$this 指的是当前 PHP 类,其中属性或函数要访问的位置。这是一个核心 PHP 概念。

0

不,我认为你的想法是错误的... $this 是用来引用同一类的对象的.. 就像这样

假设我们有一个变量值 $var,并且在那个对象实例中应该设置为 5

$this->var=5;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接