我想发布一个可以本地扩展的类A
(LocalA
)。大多数方法都需要返回$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能够拾取插件提供的方法。
2条答案
按热度按时间yks3o0rb1#
在 PHP7.4 中没有支持这个的构造。
仅在 PHP 8.0 中添加了对静态返回类型的支持。
你有四种可能的解决方案:
UtilityA::a()
方法中,然后从A::a(): self
或LocalA::a(): self
调用它,这样您就可以解决这个问题,并在正确的类中指定self
。这是一个更传统的方法,因为PHP Traits是为了支持 opp-composition 而添加的。所以你只使用类来实现traits。
更像是样板文件,尽管不比使用别名语法连接PHP Trait多多少:
UtilityA::a as a
.: static
返回类型支持的好处。t98cgbkg2#
我发现下面的工作,虽然我也开放的替代答案.
不过,我不能在PHP语言中指定这一点,这似乎是一个遗憾。