如何让PhpStorm识别__call魔术方法处理的动态函数返回类型?
解决方案:让PhpStorm自动识别__call动态方法的返回类型
你的需求无法通过原生PHPDoc注解直接实现,但可以通过以下两种框架层面的方案,无需开发者手动添加注解就能让PhpStorm精准识别每个动态存储过程调用的返回类型:
方案1:生成PhpStorm专属元数据文件
PhpStorm支持读取.phpstorm.meta.php文件来扩展代码提示能力,框架可以在解析开发者的存储过程声明文件后,自动生成/更新这个元数据文件,把每个存储过程名映射到对应的返回类型。
实现思路
- 框架解析存储过程声明文件,提取存储过程名和对应的架构类型(a/b/c);
- 根据架构类型映射到对应的返回类(return_a/return_b/return_c);
- 生成如下格式的
.phpstorm.meta.php文件:
<?php namespace PHPSTORM_META { $STATIC_METHOD_TYPES = [ \Database::class => [ 'some_proc()' => \return_a::class, 'user_list()' => \return_b::class, // 所有解析到的存储过程自动生成对应条目 ] ]; }
- 将这个文件放在项目根目录,PhpStorm会自动读取并识别动态方法的返回类型。
方案2:自动生成带注解的代理类
框架可以在解析存储过程声明后,自动生成一个继承自Database的代理类,并在类上添加对应的@method注解,开发者使用这个代理类而非直接实例化Database。
实现思路
- 解析存储过程声明文件,提取所有存储过程名、参数和返回类型;
- 生成类似下面的代理类文件:
<?php /** * @method return_a some_proc($args) * @method return_b user_list(int $page) * @method return_c log_record(string $content) */ class DatabaseProxy extends Database {}
- 开发者通过
$database = new DatabaseProxy();来调用存储过程,PhpStorm会通过代理类的@method注解识别每个动态方法的返回类型。
为什么你之前的尝试无效
- 直接在
Database类上添加@method return_a|return_b|return_c __call(...):PhpStorm不会将__call的返回类型关联到具体的动态方法调用,只会把所有动态调用都提示为联合类型; - 在
__call方法上添加@return return_a|return_b|return_c:同样只能让PhpStorm提示可能的返回类型集合,无法精准对应到某个特定存储过程的返回类型。
内容的提问来源于stack exchange,提问作者Kmus
相关产品推荐
相关产品推荐

