[英]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.