【问题标题】:PHP dynamic return type hintingPHP 动态返回类型提示
【发布时间】:2016-12-23 01:39:51
【问题描述】:

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

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

【问题讨论】:

  • 您的问题中有一个错误:that I do not know the full list of classes this function can return vs aware of the manual type hinting 如果您现在不首先,您将如何输入它,唯一的解决方案:所有类都必须实现相同的@987654329 @ 然后这个接口用于返回 typ in PHP7 only like functionA : interfacX (){}
  • php 中还没有多类型提示:stackoverflow.com/questions/36873567/…
  • 旁注:在 php 中,/** @var Foo $foo */ 允许像 PHPStrom 这样的 php 工具为您提供返回类的方法/道具的正确列表,如果给出了 1-1 类型提示。
  • @MarcB 我看到投票决定反对该功能。另一方面,我只是快速滚动浏览。它不在桌面上吗?
  • @Nordenheim:不知道。不太关注php的开发内容。击败我为什么他们不允许它,因为几乎所有 php 的核心函数都已经做了双重类型的返回。一些资源/价值,或失败为假。即使他们没有将其作为一般的“返回任何类型的东西”,允许“特定类型或布尔值”至少允许用户级代码复制核心功能已经具备的能力。

标签: php types


【解决方案1】:

现在可以使用 IntellJ (IDEA/phpStorm/webStorm) 插件 DynamicReturnTypePlugin 来实现: https://github.com/pbyrne84/DynamicReturnTypePlugin

【讨论】:

    【解决方案2】:

    为此,我使用 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
    }
    

    【讨论】:

      猜你喜欢
      • 2015-03-05
      • 2016-08-01
      • 2016-04-15
      • 2015-11-23
      • 1970-01-01
      • 2014-03-06
      • 1970-01-01
      • 2011-02-02
      • 2015-12-19
      相关资源
      最近更新 更多