Php 在此上下文中应选择哪个选项,自我、静态还是此。这有什么区别吗?
PHP文档解释了作用域解析操作符(::),它主要用于静态上下文以及self、static和parent 但是,不管是否使用静态上下文,都可以使用它来代替$this,如本例所示: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
class A {
public function funA() {
self::funB(); // *Works*
static::funB(); // *Works*
$this->funB(); // *Works*
}
public function funB() {
}
}
这是一个PHP设计问题还是我误解了什么?我发现::、静态和self的用法有点令人困惑。。。什么时候选择一个或另一个?PHP手册在中解释了这一点,尽管它可能并不像应该的那样简洁。 请允许我提供我自己的解释 指引如下:
总是指出现单词self
的类self
始终在静态上下文中引用当前类,即使该类已扩展static
始终引用对象上下文中的当前类,即使该类已扩展$this
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但根据上下文,某些选项可能会出现错误,因为这会导致混淆…可能会重复