php 回调函数 this,php – 如何在回调函数内注释$this

尽管代码示例来自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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值