【问题标题】:PHPDoc or type hint class as parameter to methodPHPDoc 或类型提示类作为方法的参数
【发布时间】: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();
}

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

【问题讨论】:

    标签: php phpdoc type-hinting


    【解决方案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
    

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

    【讨论】:

      猜你喜欢
      • 2023-04-06
      • 2016-08-30
      • 2011-01-01
      • 1970-01-01
      • 2010-10-21
      • 2017-02-24
      相关资源
      最近更新 更多