【问题标题】:Confused about type hinting in PHP对 PHP 中的类型提示感到困惑
【发布时间】:2019-09-07 03:06:05
【问题描述】:

所以考虑下面的例子:

interface ViewBuilderContract {
    public function addFormName(string $formName): self;
}

现在让我们实现这个:

class ViewBuilder implements ViewBuilderContract {

    private $formNames = [];

    public function addFormName(string $formName): self {
        $this->formNames[] = $formName;

        return $this;
    }
}

docs而言:

self 参数必须是与参数相同的类的实例 方法定义在。这只能用于类和实例 方法。

这就是我通过返回 $this 所做的 - 根据文档。

但是当我跑步时:

(new ViewBuilder)->addFormName('sample');

我明白了,你可以看到here - click execute code

ViewBuilder 的声明::addFormName(string $formName): ViewBuilder 必须与 ViewBuilderContract::addFormName(string $formName): ViewBuilderContract

根据文档,这没有意义。它应该是一个有效的回报。我只是删除self 吗?如果是这样,为什么?有没有办法规定返回值?

【问题讨论】:

  • 虽然很有趣,但它清楚地说明了错误中的问题,self 指的是 ViewBuilderContract 而不是 ViewBuilder 中的 self
  • @LawrenceCherone 我很高兴你能阅读。现在让我们关注手头的 WHY 问题。

标签: php


【解决方案1】:

您不能指定在接口中返回self。见this answer for more information

您可以改为指定该函数返回 ViewBuilderContract:

<?php
    interface ViewBuilderContract {
        public function addFormName(string $formName): ViewBuilderContract;
    }

    class ViewBuilder implements ViewBuilderContract {

        private $formNames = [];

        public function addFormName(string $formName): ViewBuilderContract {
            $this->formNames[] = $formName;

            return $this;
        }
    }

Sandbox here

【讨论】:

    猜你喜欢
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多