尽管代码示例来自Laravel,但这不是Laravel的问题!
所以我有这部分代码
class MacroServiceProvider extends ServiceProvider
{
public function boot()
{
Collection::macro('method_name', function () {
return $this->map(function ($item) {
//...do something;
});
});
}
}
问题是$this不属于MacroServiceProvider,但属于Collection,我的IDE和phpstan显示错误,当然.
编辑:问题不明确. IDE认为$this是MacroServiceProvider但回调是在Collection中执行的.所以当它执行时,这将是Collection.我想要实现的是指示代码验证器,$this内部回调是Collection实例.
是否可以注释$this并告诉它属于Collection实例?
附: PHP版本是7.3 IDE是PHPStorm但我认为没关系.
P.P.S.代码工作得很好.这只是关于phpstan验证.
解决方法:
最简单的解决方案是支持$this的docblock – 它适用于PhpStorm,不确定phpstan:
class MacroServiceProvider extends ServiceProvider
{
public function boot()
{
Collection::macro('method_name', function () {
/** @var Collection $this */
return $this->map(function ($item) {
//...do something;
});
});
}
}
但是请记住,任何调用猴子修补的Collection方法都会导致同样的问题 – IDE和分析人员都不会知道它的存在.我个人会避免使用这些策略 – 我宁愿使用合成来将集合渲染到其他对象 – 无论是自定义集合类还是需要集合的容器.但这当然不是Laravel-ish做事的方式.
UPDATE.为phpstan发现了一些不错的包装 – larastan – “支持Laravel的美丽魔法”.它可能会有所帮助.
标签:php,laravel
来源: https://codeday.me/bug/20190627/1302786.html