首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >接口实现使用参数验证的奇怪问题

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

Stack Overflow用户
提问于 2019-09-05 09:51:21
回答 2查看 57关注 0票数 0

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

代码语言:javascript
复制
<?php

namespace App\Contracts;

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

具有以下实现

代码语言:javascript
复制
<?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 [];
    }
}

以及使用

代码语言:javascript
复制
<?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)
    }
}

我的问题是有关这项实施的使用。

因此,以下是一个有效的用法:

代码语言:javascript
复制
$filePattern = 'APATTERN';
$this->fileSource->getFilesByPattern(filePattern)

但出于某种原因,以下内容也被视为一种有效用法?

代码语言:javascript
复制
$filePattern = 'APATTERN';
$this->fileSource->getFilesByPattern(filePattern,filePattern,filePattern,filePattern,filePattern,filePattern,filePattern)

为何它不关心我不符合我的执行呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-05 12:59:58

所以万一别人偶然发现了这个,

感谢LazyOne帮助我解释我做错了什么

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

当接口的重点是执行这样的事情时,为什么要执行一个实现。

Doh

票数 0
EN

Stack Overflow用户

发布于 2019-09-05 10:25:40

为什么它不关心我不符合我的执行

这就是接口的全部意义--他们不关心实现。他们只关心如何定义方法,以及签名是否符合接口。

但是,我认为这里提出的真正问题是,为什么当多个参数被传递给函数时,PHP解释器不会抛出异常。答案是因为这就是PHP实现重载的方式。它们允许传递变量数量的参数,您可以使用诸如func_get_args之类的函数访问这些参数。

您肯定应该阅读https://www.php.net/manual/en/functions.arguments.php#functions.variable-arg-list,并查看新的(Ish) splat运算符...

相似QAs

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57802825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档