【问题标题】:php type hinting for object type对象类型的 php 类型提示
【发布时间】:2017-11-21 18:04:05
【问题描述】:

我在文档中没有找到有关此的信息,但它似乎存在逻辑。如何为返回 object 类型的值制作类型提示? (我说的是任何对象,而不是某个对象,例如 \DateTime 等)

function getParticipant(): ?object
{
   //...
  $x = new Cat(); 
  return $x;
}

它不起作用,真正不公平的是print getType($x) 将导致object。所以我们有一个object 类型,但不能严格地说我们会返回一个object

你可能会说这真的没有必要,我可以只写: Cat,但是当我覆盖一个在他的PHPDoc中包含* @return object|null */的方法时,这不是我所需要的。

【问题讨论】:

  • 你可以看到RFC here。如您所见,它在上个月才被 PHP 7.2 接受
  • 哇,很高兴发现。您能否对您的评论做出答复,以便我将其标记为已接受?

标签: php type-hinting php-7.1


【解决方案1】:

:object 无法解析具有此类型的变量。事实上,PHP 会寻找名为 object 的类,并期望返回该类的实例。

使用您的示例,您应该指出该函数将返回 Cat 的实例,因此它应该如下所示:

function getParticipant(): Cat
{
    return new Cat();
}

我会说 PHPDoc 说 object 将被返回很好。 IDE 应该可以解决这个问题,对于 PHP 解释器来说这并不重要。

如果您要覆盖方法,您可以简单地覆盖 PHPDoc 中的 @return 语句。

【讨论】:

  • 问题是IDE(例如phpstorm)会突出显示覆盖的方法,如果父方法只是一个对象,则在该方法中返回某个对象。覆盖 PHPDoc 是可以的,但味道仍然不好。
【解决方案2】:

我找不到确切的解释,但目前您可以返回类、标量值,并且从 PHP 7.1 开始,您有 void 作为返回值。但在您的情况下,作为返回值的“对象”不存在。

在我看来,检查您返回哪个对象以明确您返回正确的对象更有意义。所以在你的情况下:

function getParticipant(): Cat
{
   //...
  $x = new Cat(); 
  return $x;
}

然后你可以确定你的函数返回你期望的对象。

【讨论】:

  • 我知道这一切。正如我在原始帖子中所说,我需要它来匹配我要重写的函数的 PHPDoc,并且我在当前项目中使用类型提示,所以我想在任何地方使用它。
【解决方案3】:

通用 object 的类型提示在 PHP 中尚不存在,但由于 RFC Object typehint 于 2017 年 5 月 31 日以 32 票对 3 票通过,因此应该从 7.2.0 版开始提供。

虽然通常(在可能的情况下)最好还是对特定的类或接口进行类型提示。

【讨论】:

  • >虽然通常(在可能的情况下)对特定的类或接口进行类型提示仍然更好......我同意如果我们在 PHP 中有泛型但有时“对象”是如此需要!
  • Arrgh,非常感谢,我已经难以置信地盯着这个错误消息一个小时,只是无法克服它:Fatal error: Uncaught TypeError: Argument 1 passed to ...() must be an instance of object, instance of SomeClass given... :) 我在 7.1,但我的 CLI 是 7.2,所以很高兴能够确认它确实已经修复。 (顺便说一句,很高兴看到这是如何通过 RFC 解决的,而不仅仅是错误报告。;-p)
猜你喜欢
  • 2013-07-18
  • 2017-09-09
  • 2023-03-22
  • 2015-02-17
  • 2017-07-05
  • 2018-01-04
  • 2015-09-22
  • 1970-01-01
相关资源
最近更新 更多