我想发布一个可以本地扩展(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(): self
或LocalA::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语言中指定这个。