为什么self :: function()和$ self->变量或self :: $变量,即使有$ this-> function()和$ this->变量(PHP)?

时间:2009-11-09 13:22:57

标签: php this keyword self

我对这两个关键字以及在PHP5中使用它们的方式感到困惑。我认为“this”用于实例对象(不是静态的),而“self”是指对象本身,而不是它的实例,因此在静态对象中使用。正确?

现在,我相信在类的静态方法中正确使用它来调用另一个静态变量/方法如下:

self::doSomething();
self::$testVar;

那是真的吗?

然而,以下似乎也是可能的:

$self->testVar;

然而,$ testVar是静态的。那是为什么?

另外,为什么$有时候会在自我面前使用,有时也不会使用“和”这个关键字的问题?

2 个答案:

答案 0 :(得分:5)

你是对的,self是静态自引用,而$是实例化的。 self和$这似乎可以在任何地方使用,但请考虑一下:

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

  public static function bar()
  {
    echo 'foobar!';
  }
}

A::foo(); // Fatal error: Using $this when not in object context

这会导致致命错误,因为静态调用了foo()。最好花一些时间并适当地使用它们,而不是总是使用其中一种。

答案 1 :(得分:3)

您似乎正确地理解了这一点。当您没有可用对象的实例时,self ::用于静态成员和函数,而$ this->当你这样做时会使用语法。

所以在一个静态方法中,你必须使用self :: b / c,静态方法只是... static,可以在没有创建对象实例的情况下调用。 (即YourClass :: staticFunction())尽管在非静态方法中使用$ this-> memberVar是完全合乎逻辑的,因为函数是通过实例化对象调用的。 ($ yourClass-> nonStaticFunction())因此$ this实际上存在于函数的上下文中。