在这种情况下,应该选择自身,静态或这种方式中的哪个选项。有什么区别吗?

时间:2018-07-21 16:31:47

标签: 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 function funB() {
   }
}

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

1 个答案:

答案 0 :(得分:1)

PHP手册在Late Static Bindings中对此进行了解释,尽管也许它并不像应该的那样简洁。 请允许我提供自己的解释。

以下是指南:

  
      
  • 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

如您所见,static$this指的是同一类(B类)。 让我们用扩展类B的另一个类扩展该示例:

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

(new C)->test();

输出:

A
C
C

请注意,static$this再次引用了同一类,这次是C类, 因为static$this始终引用当前类,即使扩展了该类。

那么static$this有什么区别? 不同之处在于上下文。 $this不需要一个对象(一个类实例),而static不需要一个对象。

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

C::test();

输出:

A
C

Fatal error: Using $this when not in object context in C:\wamp\www\test.php on line 7

第一次和第二次调用在静态上下文中可以正常工作,但是第三次​​调用失败,因为$this需要对象上下文。 查看https://ideone.com/AVtITz

上的代码