簡體   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