PHPDoc 或类型提示类作为方法的参数

Posted

技术标签:

【中文标题】PHPDoc 或类型提示类作为方法的参数【英文标题】:PHPDoc or type hint class as parameter to method 【发布时间】:2018-01-20 10:04:48 【问题描述】:

如何指示函数/方法接受类作为参数? phpDoc 或类型提示就足够了,但似乎都不允许这样做。

这是我认为应该可行的示例......

/**
 * @param $class class  A reference to a class that will be used to do something
 */
function doReallyWeirdStuff(class $class)
  $class::callStaticMethod();

我已经知道如何将类传递给这个函数。我如何表明您应该这样做?

【问题讨论】:

【参考方案1】:

类名只是字符串,因此您必须将它们作为字符串输入提示。然后,您需要在运行时在您的方法中检查它实际上是一个类:

/**
 * @param $class string  A reference to a class that will be used to do something
 */
function doReallyWeirdStuff(string $class)
  if (class_exists($class)) 
    $class::callStaticMethod();
   else 
    throw \InvalidArgumentException;
  

请注意,要严格遵守字符串值(如类名所要求的那样),您需要启用严格类型提示:

declare(strict_types=1);

否则,您可能会这样调用:

doReallyWeirdStuff(M_PI);

这没有多大意义。

【讨论】:

啊哈!极好的!谢谢 要传入类名,您应该使用 \MyNamespace\MyClass::class 以便您的 IDE 可以重构该代码。 我会在等待期到期后尽快处理。 :) declare(strict_types=1) 不需要启用标量类型提示。仅当您希望 PHP 在文件中不遵守确切类型时抛出错误时才需要它(默认情况下,PHP 会将另一种类型转换为提示的类型,而不是抛出错误) 您对 OP 的看法可能是正确的。只是说不准确,因为除了 OP 之外,很多人可能会遇到您的解决方案并按字面意思理解您的话。【参考方案2】:

你不能用 PHPDoc 类型提示来做到这一点,除非你传递一个实际的对象实例。

但是,您可以滥用 PHP Doc 类型提示。

string|Class $class
or
Class $class

这将产生非常复杂的结果,具体取决于您正在运行的内容。您将失去一些在没有误报/误报的情况下运行类型检查的能力。

【讨论】:

以上是关于PHPDoc 或类型提示类作为方法的参数的主要内容,如果未能解决你的问题,请参考以下文章

派生类中 PHPDoc 中的 PHP 类型提示

派生类返回值的 PhpStorm 类型提示

使用类作为其方法中参数的类型提示[重复]

PHPDoc 类型提示重叠类型

声明类型提示时,PhpStorm 是不是允许跳过 PHPDoc 标记?

PhpStorm - 有没有办法将 PHPDoc 转换为类型提示并返回类型声明?