Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 接口实现使用中参数验证的奇怪问题_Php_Laravel_Interface_Phpstorm - Fatal编程技术网

Php 接口实现使用中参数验证的奇怪问题

Php 接口实现使用中参数验证的奇怪问题,php,laravel,interface,phpstorm,Php,Laravel,Interface,Phpstorm,因此,基本上我不确定这是一个PhpStorm问题,还是解析我的代码,或者这是一个奇怪的PHP和接口的怪癖,但基本上我有以下接口 <?php namespace App\Contracts; /** * Interface IFileSource * @package App\Contracts */ interface IFileSource { public function getFilesByPattern(string $filePattern) : array;

因此,基本上我不确定这是一个PhpStorm问题,还是解析我的代码,或者这是一个奇怪的PHP和接口的怪癖,但基本上我有以下接口

<?php

namespace App\Contracts;

/**
 * Interface IFileSource
 * @package App\Contracts
 */
interface IFileSource
{
    public function getFilesByPattern(string $filePattern) : array;
}

但出于某种原因,以下也被视为有效的用法

$filePattern = 'APATTERN';
$this->fileSource->getFilesByPattern(filePattern,filePattern,filePattern,filePattern,filePattern,filePattern,filePattern)
为什么它不关心我不符合我的实施

为什么它不关心我不符合我的实施

<?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解释器不抛出异常。答案是因为这就是PHP实现重载的方式。它们允许传递数量可变的参数,您可以使用func_get_args等函数访问这些参数

你肯定应该阅读并研究一下新的splat操作符

类似QAs


所以万一有人偶然发现这个

感谢懒人帮我解释我做错了什么

这是因为我在PHPdoc中强制实现,而不是依赖接口来强制执行类型提示,或者将接口添加为类型提示而不是实现,一旦我更改了它,它就会像预期的那样开始抱怨

当接口的重点是强制执行这些事情时,为什么要强制执行一个实现呢


Doh始终提供一个真实的代码示例,可以轻松地进行复制粘贴和本地测试。在我的代码中,它总是强调这是一个错误。但我的代码可能和你的不同…哈哈,抱歉,但现在我认为我们应该尝试一个以MinimalPhpsForm为重点的测试,如果你使用IFileSource而不是FileSource,它将正确地报告一个警告。至少在我没有Laravel代码的测试项目中,PHP语言级别设置为7.2,如果这会造成任何差异的话。如果我在PHPDoc typehint中为字段和构造函数参数使用FileSource,那么它在两个PACE中都是相同的。如果同时使用接口和具体类typehint,IDE会看到两个可能的签名,那么它也会起作用。尽管它们是相同的。。。有两个。。。。可能是bug或特定于IDE的限制-检查/向代码报告没有问题-没有问题。但是如果您使用接口作为参数类型提示。。。然后通过PHPDoc使用其他地方的接口以及字段typehint。如果正在使用接口,那么使用特定类的typehint没有多大意义,不需要混合它们。谢谢!所以,也许我应该问的真正问题是,有没有一种方法可以禁用实现的方法重载?我的印象是,如果您需要此类函数的另一个版本,如中所示,则表明您需要更新实现/接口的设计。因此,在我的例子中,如果我需要getFileByPattern也将文件路径与文件名分开,我会创建getFileByPattern和path,而不是增加getFileByPattern的复杂性以支持重载参数?也许我想的太小了。。。
$filePattern = 'APATTERN';
$this->fileSource->getFilesByPattern(filePattern)
$filePattern = 'APATTERN';
$this->fileSource->getFilesByPattern(filePattern,filePattern,filePattern,filePattern,filePattern,filePattern,filePattern)