是否可以在 PHP 中使用 phpdoc 从类变量定义参数类型

问题描述 投票:0回答:1

现在我有这个:

class UserProvider
{
    protected string $className = User::class;

    /**
     * @param User $entity
     */
    public function getData($entity): array
    {
        $data['name'] = $entity->getName();

        return $data;
    }
}

但我正在寻找这样的东西:

class UserProvider
{
    protected string $className = User::class;

    /**
     * @param [UserProvider->className] $entity
     */
    public function getData($entity): array
    {
        $data['name'] = $entity->getName();

        return $data;
    }
}

有什么想法吗?

php phpdoc
1个回答
0
投票

在 PHP 中,您不能直接引用 PHPDoc 块中的类变量来指定参数类型。 PHPDoc 语法不支持这种动态类型。

如果您想基于类变量

$entity
$className
参数强制执行特定类型,则必须在代码本身中执行此操作,而不仅仅是在 PHPDoc 注释中。

您可以通过在方法中结合使用

instanceof
is_a
函数来实现此目的:

class UserProvider
{
    protected string $className = User::class;

    /**
     * @param mixed $entity
     * @return array
     */
    public function getData($entity): array
    {
        if (!is_a($entity, $this->className)) {
            throw new \InvalidArgumentException('$entity must be an instance of ' . $this->className);
        }

        $data['name'] = $entity->getName();

        return $data;
    }
}

在此示例中,如果

$entity
不是
$className
中指定的类的实例,则会抛出异常。

请记住,这种方法在运行时强制执行类型,而不是在静态分析时强制执行。因此,您将无法获得 PHPStan 等静态分析工具或基于 PHPDoc 注释的 IDE 自动完成功能的好处。

如有任何问题,请告诉我。 谢谢您——继续编码

© www.soinside.com 2019 - 2024. All rights reserved.