PHP文档解释了作用域解析运算符(::),它主要用于静态上下文以及self,static和parent。
但是随后您发现,无论是否有静态上下文,都可以使用它代替$ this,如本例所示:
class A {
public function funA() {
self::funB(); // *Works*
static::funB(); // *Works*
$this->funB(); // *Works*
}
public function funB() {
}
}
这是PHP设计问题还是我误解了?我发现::,静态和self的用法有点令人困惑...什么时候选择一个或另一个?
答案 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