【发布时间】:2020-01-08 04:46:55
【问题描述】:
所以基本上我不确定这是解析我的代码的 PhpStorm 问题,还是 PHP 和接口的奇怪怪癖,但基本上我有以下接口
<?php
namespace App\Contracts;
/**
* Interface IFileSource
* @package App\Contracts
*/
interface IFileSource
{
public function getFilesByPattern(string $filePattern) : array;
}
使用以下实现
<?php
namespace App\Sources;
use App\Contracts\IFileService;
use App\Services\File\FileService;
/**
* Class FileSource
* @package App\Sources
*/
class FileSource implements IFileSource
{
/**
* @var FileService
*/
private $fileService;
public function __construct (IFileService $fileService)
{
$this->fileService = $fileService;
}
/**
* @param string $filePattern
* @return File[]
* NOTE THIS ASSUMES FILESYSTEM
*/
public function getFilesByPattern (string $filePattern) : array
{
$filesDetails = $this->fileService->getFilesByPattern($filePattern);
return [];
}
}
及用途
<?php
namespace App\Console\Commands;
use App\Contracts\IFileSource;
use App\Sources\FileSource;
class ImportXML extends Command
{
/**
* @var FileSource
*/
protected $fileSource;
public function __construct (IFileSource $fileSource)
{
parent::__construct();
$this->fileSource = $fileSource;
}
public function handle () : void
{
$filePattern = 'APATTERN';
$files = $this->fileSource->getFilesByPattern($filePattern)
}
}
我的问题与此实现的用法有关。
所以下面是一个有效的用法:
$filePattern = 'APATTERN';
$this->fileSource->getFilesByPattern(filePattern)
但由于某种原因,以下也被视为有效用法?
$filePattern = 'APATTERN';
$this->fileSource->getFilesByPattern(filePattern,filePattern,filePattern,filePattern,filePattern,filePattern,filePattern)
为什么它不在乎我不符合我的实现?
【问题讨论】:
-
始终提供真实的代码示例,可以轻松复制粘贴并在本地进行测试。在我的代码中,它总是将其突出显示为错误。但是我的代码可能和你的不同......
-
哈哈,对不起,但现在我认为我们应该尝试Minimal, Complete and Verifiable Example,强调最小
-
如果你使用
IFileSource而不是FileSource,PhpStorm 将正确报告警告(好吧,至少在我的测试项目中没有 Laravel 代码和 PHP 语言级别设置为 7.2,如果那样的话做任何差异)。 postimg.cc/qzk82jp5。如果我在 PHPDoc typehint 中为字段和构造函数参数使用FileSource也可以工作(所以在两个方面都是一样的) -
不能说到底为什么在同时使用接口和具体类类型提示时它不报告错误(IDE 看到 2 个可能的签名:虽然它们是相同的......有 2 个...)。可能是错误或 IDE 特定限制 - 检查/报告至 youtrack.jetbrains.com/issues/WI
-
您的代码没问题——没有问题。但是,如果您正在使用接口(作为参数类型提示)......那么在其他地方也使用接口(通过 PHPDoc 的字段类型提示)。如果正在使用接口,则使用特定类进行类型提示没有多大意义(无需混合它们)。
标签: php laravel interface phpstorm