求助:PhpStorm无法识别Trait实现的类方法如何解决?
PhpStorm无法识别Trait实现的接口方法提示问题
我搭建了一套API交互的代码结构,遇到一个PhpStorm的识别问题:当用Trait实现接口方法时,IDE无法识别方法的参数、返回值等提示;但把方法直接写在类里,或者依赖注入时用具体类而非接口,就能正常识别。
目录结构
MyService/ ├── API/ │ ├── Interfaces/ │ │ └── UpdateCenter.php │ ├── Layers/ │ │ └── UpdateCenter/ │ │ ├── Methods/ │ │ │ └── GetApiVersion.php │ │ └── UpdateCenter.php │ └── Api.php └── MyService.php
核心代码
MyService.php
<?php namespace App\Services\MyService; use App\Services\MyService\API\Api; use Illuminate\Support\Facades\App; class MyService { public Api $api; public function __construct() { $this->api = App::make(Api::class); } }
Api.php
<?php namespace App\Services\MyService\API; use App\Services\MyService\API\Interfaces; class Api { public Interfaces\UpdateCenter $updateCenter; public function __construct( Interfaces\UpdateCenter $updateCenter ) { $this->updateCenter = $updateCenter; } }
Interfaces/UpdateCenter.php
<?php namespace App\Services\MyService\API\Interfaces; interface UpdateCenter { public function getApiVersion(): string; }
使用Trait实现接口的UpdateCenter.php
<?php namespace App\Services\MyService\API\Layers\UpdateCenter; use App\Services\MyService\API\Layers\UpdateCenter\Methods; use App\Services\MyService\API\Interfaces; class UpdateCenter implements Interfaces\UpdateCenter { use Methods\GetApiVersion; }
GetApiVersion.php(Trait文件)
<?php namespace App\Services\MyService\API\Layers\UpdateCenter\Methods; trait GetApiVersion { public function getApiVersion(): string { return '1.0.0'; } }
问题表现
调用getApiVersion()时,PhpStorm完全没有方法提示,甚至错误传入参数也不会给出警告:
<?php $myService = new MyService(); $versionInfo = $myService->api->updateCenter->getApiVersion('1.0.0');
(原本此处有截图,显示IDE无方法签名提示,传入多余参数未报错)
但如果把Trait里的方法直接移到UpdateCenter类中:
修改后的UpdateCenter.php
<?php namespace App\Services\MyService\API\Layers\UpdateCenter; use App\Services\MyService\API\Interfaces; class UpdateCenter implements Interfaces\UpdateCenter { public function getApiVersion(): string { return '1.0.0'; } }
此时PhpStorm能正常识别方法的参数要求、返回值类型,给出完整提示。
另外测试发现,如果在Api类的构造函数中,直接注入UpdateCenter具体类而非Interfaces\UpdateCenter接口,PhpStorm也能正常识别Trait实现的方法提示。
内容的提问来源于stack exchange,提问作者volama1699
相关产品推荐
相关产品推荐

