如何支持PHP中返回$this的方法的IDE语言服务器类型提示



我想发布一个可以本地扩展(LocalA)的类A。大多数方法需要返回$this,以便调用可以被链接。我正在寻找一种方法来类型提示在A(和LocalA)中定义的方法的返回值,说"它返回与调用该方法的对象相同的类"。

这样,ide就可以在调用之后提供建议的方法。

:self是一种语言的可能性,但它不会这样做。这意味着在A中定义方法之后,IDE将把结果视为A而不是LocalA:

<?php
class A {
function a():self {
return $this;
}
}
class B extends A {
function b():self {
return $this;
}
}
$o = new B();
$o->➊
$o->a()->➋ 

➊处IDE会列出a()b()两种可能的方法,但➋处只列出a()

:static会很好,但无效,在PHP中不支持/实现。

下面看起来很有希望作为答案,PHP很乐意运行它:

trait trait1 {
function a():self {
return $this;
}
}
trait trait2 {
function b():self {
return $this;
}
}
class A {
use trait1;
}
class B {
use trait1;
use trait2;
}
$o = new B();
$o->➊ // offers a() and b() ✔
$o->a()->➋ // offers only a() ✖ treats the trait's 'self' as that trait, I think. 

…但令人恼火的是,我的语言服务器(智能电话通过coc-phpls)没有意识到,"自我"从一个trait应该指的是B,因此包括所有这两个特征。

我试图建立一个进口商类的数据,做一些事情。我正在使用一个流畅的界面(所以很多return $this)。我希望其他第三方能够通过添加他们自己的方法来扩展它,但这整个事情实际上是关于开发人员的体验,所以我希望ide能够拾取插件提供的方法。

PHP7.4中没有结构支持这个。
对静态返回类型的支持仅从PHP 8.0添加。

你有4种可能的解决方案:

  • 删除返回类型,因此它不会产生问题;但这是一个hack,并没有帮助开发人员的经验(这是你的全部观点)。

  • 实现手动组合,将实现放在UtilityA::a()方法中,然后从A::a(): selfLocalA::a(): self调用它,以便您解决问题并在正确的类中指定self
    这是一种更传统的方法,因为PHP Traits被添加到支持opp-composition。所以你只使用类来实现特性。
    是更多的样板文件,虽然没有比使用别名语法连接PHP Trait:UtilityA::a as a.

  • 简单地移动具体类中的方法;你的回答表明。它解决了开发人员的体验问题,但为了解决这个问题,您不得不更改您的封装设计。

  • 升级到PHP 8,获得: static返回类型支持的好处。

我发现下面的方法是有效的,尽管我也愿意接受其他的答案。

<?php
class A {
/**
* @return static
*/
public function a() { return $this; }
}
class LocalA {
/**
* @return static
*/
public function b() { return $this; }
}
$o = new LocalA();
$o->➊ // offers a() and b() ✔
$o->a()->➊ // offers a() and b() ✔
$o->a()->b()->➊ // offers a() and b() ✔

很遗憾,我不能在PHP语言中指定这个。

最新更新