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

ewm0tg9j  于 2023-03-22  发布在  PHP
关注(0)|答案(2)|浏览(118)

我想发布一个可以本地扩展的类ALocalA)。大多数方法都需要返回$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.

但令人恼火的是,我的语言服务器(intellephense via coc-phpls)没有意识到trait中的“self”应该指B,从而包括所有这两种trait。
我正在尝试构建一个导入器类,它接受数据,做一些事情。我使用了一个流畅的接口(所以有很多return $this)。我希望其他第三方能够通过添加自己的方法来扩展它,但这整个事情实际上是关于开发人员的体验,所以我希望IDE能够拾取插件提供的方法。

yks3o0rb

yks3o0rb1#

PHP7.4 中没有支持这个的构造。
仅在 PHP 8.0 中添加了对静态返回类型的支持。
你有四种可能的解决方案:

  • 删除返回类型,这样就不会产生问题;但这是一个黑客,并没有帮助开发人员的经验(这是你的全部点)。
  • 实现手动组合,将实现放在UtilityA::a()方法中,然后从A::a(): selfLocalA::a(): self调用它,这样您就可以解决这个问题,并在正确的类中指定self

这是一个更传统的方法,因为PHP Traits是为了支持 opp-composition 而添加的。所以你只使用类来实现traits。
更像是样板文件,尽管不比使用别名语法连接PHP Trait多多少:UtilityA::a as a .

  • 简单地移动具体类中的方法;你的回答表明了这一点。它解决了开发人员的体验,但为了它,你被迫改变你的设计以进行封装。
  • 升级到PHP 8并获得: static返回类型支持的好处。
t98cgbkg

t98cgbkg2#

我发现下面的工作,虽然我也开放的替代答案.

<?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语言中指定这一点,这似乎是一个遗憾。

相关问题