Php 在此上下文中应选择哪个选项,自我、静态还是此。这有什么区别吗?

Php 在此上下文中应选择哪个选项,自我、静态还是此。这有什么区别吗?,php,oop,static,this,self,Php,Oop,Static,This,Self,PHP文档解释了作用域解析操作符(::),它主要用于静态上下文以及self、static和parent 但是,不管是否使用静态上下文,都可以使用它来代替$this,如本例所示: class A { public function funA() { self::funB(); // *Works* static::funB(); // *Works* $this->funB(); // *Works* } public funct

PHP文档解释了作用域解析操作符(::),它主要用于静态上下文以及self、static和parent

但是,不管是否使用静态上下文,都可以使用它来代替$this,如本例所示:

class A {
   public function funA() {
      self::funB();  // *Works*
      static::funB();   // *Works*
      $this->funB();  // *Works*
   }
   public function funB() {
   }
}

这是一个PHP设计问题还是我误解了什么?我发现::、静态和self的用法有点令人困惑。。。什么时候选择一个或另一个?

PHP手册在中解释了这一点,尽管它可能并不像应该的那样简洁。 请允许我提供我自己的解释

指引如下:

  • self
    总是指出现单词
    self
    的类
  • static
    始终在静态上下文中引用当前类,即使该类已扩展
  • $this
    始终引用对象上下文中的当前类,即使该类已扩展
如以下示例所示,如果您希望始终参考A类,请使用
self
, 如果希望在B为当前类时始终引用B类,请使用
static
$this

class A {
    public function test() {
        echo self::who();   // always class A
        echo static::who(); // always the current class (static context)
        echo $this->who();  // always the current class (object context)
    }
    public function who() {
        echo __CLASS__ . "\n";
    }
}

class B extends A {
    public function who() {
        echo __CLASS__ . "\n";
    }
}

(new B)->test();
输出:

A
B
B
A
C
C
A
C

Fatal error: Using $this when not in object context in C:\wamp\www\test.php on line 7
如您所见,
static
$this
指的是同一类(B类)。 让我们用另一个扩展类B的类来扩展示例:

class C extends B {
    public function who() {
        echo __CLASS__ . "\n";
    }
}

(new C)->test();
输出:

A
B
B
A
C
C
A
C

Fatal error: Using $this when not in object context in C:\wamp\www\test.php on line 7
请注意,
static
$this
再次引用同一类,这次是C类, 因为
静态
$此
始终引用当前类,即使该类已扩展

那么
静态
$this
之间有什么区别呢? 区别在于上下文。
$this
需要对象(类实例),而
static
不需要

让我们看看在静态上下文中调用
test()
会发生什么:

C::test();
输出:

A
B
B
A
C
C
A
C

Fatal error: Using $this when not in object context in C:\wamp\www\test.php on line 7
第一个和第二个调用在静态上下文中工作正常,但第三个调用失败,因为
$this
需要对象上下文。
请参见

中的代码,我建议您查看以下答案:)@Ezabilam但根据上下文,某些选项可能会出现错误,因为这会导致混淆…可能会重复