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