PHP如何通过闭包在Foo::create内正确访问Menu类的成员方法
解决方案
一、Foo::create 方法实现
你只需要调整create方法的执行逻辑,不需要依赖闭包的返回值:
Class Foo { /** * @param string $menu 菜单标识 * @param \Closure(Menu $menu): void $callback 配置闭包 * @return Menu 配置完成的Menu实例 */ public static function create(string $menu, Closure $callback): Menu { // 提前实例化Menu对象 $menuInstance = new Menu(); // 执行闭包,传入实例,对象是引用传递,闭包内调用方法会直接修改当前实例 $callback($menuInstance); // 方法自行返回实例,无需闭包返回 return $menuInstance; } }
上述实现完全兼容你需要的无return写法,逻辑简单无额外性能损耗。
额外注意:你现有代码闭包内用到的$logolink是外部变量,PHP匿名函数默认无法直接访问外部变量,需要用use关键字引入才不会报变量未定义错误:
Foo::create('topMenu',function(Menu $menu) use ($logolink) { $menu->logo($logolink); $menu->color('blue'); });
二、IDE代码提示问题
这是普遍现象,不是本地配置问题:
- 闭包参数显式声明
Menu $menu类型时,PhpStorm可以直接识别参数类型,所以能正常提示成员方法 - 没有显式声明参数类型时,IDE默认无法推断闭包接收的参数类型,所以不会生成提示
如果想让无类型声明的闭包也能正常提示,只要给Foo::create方法加上上述示例中的PHPDoc注解,明确标注$callback的参数类型为Menu,PhpStorm就会自动解析注解,给$menu提供代码提示。
内容的提问来源于stack exchange,提问作者AloneCoder
相关产品推荐
相关产品推荐

