3

I have an example function in PHP (8.2) that returns an array. Inside this array there is also an object, more precisely stdClass.

I use PHPStan as a static analyzer tool. How can I specify this (object shapes) structure syntactically correct to use it in @phpstan-return using PHPStan Array shapes ?

The example function getBooks():

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,
    ];
}

What I already tried and is an invalid syntax:

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

What I definitely already know is, that the object { .. } part is the syntactically incorrect one here.

2

2 Answers 2

8

As of PHPStan 1.10.12 this is now possible:

https://phpstan.org/writing-php-code/phpdoc-types#object-shapes

So, for your case, that would be written:

/**
 * @return object{
 *     id: int,
 *     title: string,
 *     authors: object{
 *         firstName: string,
 *         lastName: string,
 *     },
 * }
 */
Sign up to request clarification or add additional context in comments.

Comments

1

You can define the associative array architecture with the array<keyType, valType|valType|...> pattern:

/** @return array<string, int|stdClass|string> */
function getBook(): array
{ ... }

PHPStan demo

or specify that it is a mixed array:

/** @return array<mixed> */
function getBook(): array
{ ... }

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.