You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PHPStan的@phpstan-return中正确标注含stdClass的数组结构?

问题描述

我有一个PHP 8.2的示例函数getBook(),它返回一个array,该数组中包含一个stdClass类型的对象。我使用PHPStan作为静态分析工具,希望通过PHPStan数组形状语法在@phpstan-return中正确标注该返回结构。

示例函数getBook()

function getBook(): array
{
    $author = new stdClass();
    $author->firstName = 'John';
    $author->lastName = 'Doe';

    return [
        'id' => 12345,
        'title' => 'Whoever may help me deserves a big "Thank You!"',
        'authors' => $author,
    ];
}

我尝试了以下语法,但它是无效的:

/**
 * @phpstan-return array{
 *     id: int,
 *     title: string,
 *     authors: object{
 *         firstName: string,
 *         lastName: string,
 *     },
 * }
 */

我确定其中的object{..}部分是语法错误所在,请问正确的写法是什么?


正确写法说明

在PHPStan中,标注stdClass的结构不能直接用object{...}语法,需要明确关联stdClass类型并结合结构约束,有两种常用写法:

方式1:兼容旧版本PHPStan的写法

/**
 * @phpstan-return array{
 *     id: int,
 *     title: string,
 *     authors: stdClass&object{
 *         firstName: string,
 *         lastName: string,
 *     },
 * }
 */
function getBook(): array
{
    // 函数实现不变
}

方式2:PHPStan 1.8+的简化写法

/**
 * @phpstan-return array{
 *     id: int,
 *     title: string,
 *     authors: stdClass{
 *         firstName: string,
 *         lastName: string,
 *     },
 * }
 */
function getBook(): array
{
    // 函数实现不变
}

原写法无效的原因

PHPStan中单独的object{...}代表匿名对象类型,而非stdClass实例。你的函数返回的是明确的stdClass对象,必须明确指定stdClass类型并附加结构约束,PHPStan才能正确识别并完成静态分析。

内容的提问来源于stack exchange,提问作者WebDevPassion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 22:33:20