现在我有这个:
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 块中的类变量来指定参数类型。 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 自动完成功能的好处。
如有任何问题,请告诉我。 谢谢您——继续编码