gpt4 book ai didi

PHP 动态返回类型提示

转载 作者:行者123 更新时间:2023-12-05 05:23:00 25 4
gpt4 key购买 nike

假设我有以下 PHP 函数:

/**
* @param string $className
* @param array $parameters
* @return mixed
*/
function getFirstObject($className, $parameters) {
// This uses a Doctrine DQl builder, but it could easily replaced
// by something else. The point is, that this function can return
// instances of many different classes, that do not necessarily
// have common signatures.
$builder = createQueryBuilder()
->select('obj')
->from($className, 'obj');
addParamClausesToBuilder($builder, $parameters, 'obj');
$objects = $builder
->getQuery()
->getResult();
return empty($objects) ? null : array_pop($objects);
}

基本上,该函数总是返回用 $className 参数指定的类的实例,如果出现问题,则返回 null。唯一的问题是,我不知道这个函数可以返回的类的完整列表。 (在编译时)

是否可以获取此类函数返回类型的类型提示?

在 Java 中,我会简单地使用泛型来暗示返回类型:

static <T> T getOneObject(Class<? extends T> clazz, ParameterStorage parameters) {
...
}

我知道手动类型提示,比如

/** @var Foo $foo */
$foo = getOneObject('Foo', $params);

但我想要一个不需要此样板行的解决方案。

详细说明:我正在尝试围绕 Doctrine 编写一个包装器,以便我可以轻松获得我想要的模型实体,同时封装 ORM 系统的所有特定用法。我正在使用 PhpStorm。

** 编辑功能以反射(reflect)我的预期用途。我最初想让它不包含任何特定的用例,以免使问题膨胀。还要注意,实际的包装器更复杂,因为我还合并了特定于模型的隐式对象关系和连接等。

最佳答案

为此,我使用 phpdoc @method。例如,我创建了由其他 Repository 类扩展的 AbstractRepository 类。假设我们有 AbstractRepository::process(array $results) 方法,其返回类型根据扩展它的类而改变。所以在子类中:

/**
* @method Car[] process(array $results)
*/
class CarRepo extends AbstractRepository {
//implementation of process() is in the parent class
}

更新 1:

您还可以使用 phpstan/phpstan 库。用于静态代码分析,您可以使用它来定义 generic return types :

/**
* @template T
* @param class-string<T> $className
* @param int $id
* @return T|null
*/
function findEntity(string $className, int $id)
{
// ...
}

关于PHP 动态返回类型提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38978977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com