繁体   English   中英

"PHP 动态返回类型提示"

[英]PHP dynamic return type hinting

假设我有以下 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。

** 编辑功能以反映我的预期用途。 我最初想保持它没有任何特定的用例,以免问题膨胀。 另请注意,实际的包装器更复杂,因为我还合并了特定于模型的隐式对象关系和连接等。

这现在可以通过 IntellJ (IDEA/phpStorm/webStorm) 插件 DynamicReturnTypePlugin 实现: https : //github.com/pbyrne84/DynamicReturnTypePlugin

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM