Skip to content

Support for array shape for ArrayAccess classes not working. #8549

Open
phpstan/phpstan-src
#6903

Description

@lulco

Bug report

In #7619 there is mentioned the way how to use array shape for ArrayAccess https://phpstan.org/r/95a7bcea-3198-4297-8770-823861adacfb but it seems it is not working anymore. Can you please check it? Thank you very much.

Activity

  1. ondrejmirtes commented on Dec 18, 2022

    @ondrejmirtes
    Member

    Broke in this PR: phpstan/phpstan-src#1623

  2. added this to the Easy fixes milestone on Dec 18, 2022
  3. phpstan-bot commented on Dec 19, 2022

    @phpstan-bot
    Contributor

    @lulco After the latest push in 1.9.x, PHPStan now reports different result with your code snippet:

    @@ @@
    +PHP 8.1 (6 errors)
    +==========
    +
    +21: Return type mixed of method Options::offsetGet() is not covariant with tentative return type mixed of method ArrayAccess::offsetGet().
     45: Dumped type: string
    +46: Cannot assign offset 'name' to Options<array<string, string>>.
    +46: Options<array{name: string}> does not accept string.
    +47: Cannot assign offset 'name' to Options<array<string, string>>.
    +47: Options<array{name: string}> does not accept int.
    +
    +PHP 7.1 – 8.0 (5 errors)
    +==========
    +
    +45: Dumped type: string
    +46: Cannot assign offset 'name' to Options<array<string, string>>.
    +46: Options<array{name: string}> does not accept string.
    +47: Cannot assign offset 'name' to Options<array<string, string>>.
     47: Options<array{name: string}> does not accept int.
    Full report

    PHP 8.1 (6 errors)

    Line Error
    21 Return type mixed of method Options::offsetGet() is not covariant with tentative return type mixed of method ArrayAccess::offsetGet().
    45 Dumped type: string
    46 Cannot assign offset 'name' to Options<array<string, string>>.
    46 Options<array{name: string}> does not accept string.
    47 Cannot assign offset 'name' to Options<array<string, string>>.
    47 Options<array{name: string}> does not accept int.

    PHP 7.1 – 8.0 (5 errors)

    Line Error
    45 Dumped type: string
    46 Cannot assign offset 'name' to Options<array<string, string>>.
    46 Options<array{name: string}> does not accept string.
    47 Cannot assign offset 'name' to Options<array<string, string>>.
    47 Options<array{name: string}> does not accept int.
  4. VincentLanglet commented on Feb 19, 2023

    @VincentLanglet
    Contributor

    I take a look at this and:

    @rvanvelzen Since both of the PR were made by you, can you help me on this ?
    Do you see the issue ?

  5. phpstan-bot commented on Apr 4, 2023

    @phpstan-bot
    Contributor

    @lulco After the latest push in 1.10.x, PHPStan now reports different result with your code snippet:

    @@ @@
    +PHP 8.1 (6 errors)
    +==========
    +
    +21: Return type mixed of method Options::offsetGet() is not covariant with tentative return type mixed of method ArrayAccess<key-of<TArray of array>,value-of<TArray of array>>::offsetGet().
     45: Dumped type: string
    +46: Cannot assign offset 'name' to Options<array<string, string>>.
    +46: Options<array{name: string}> does not accept string.
    +47: Cannot assign offset 'name' to Options<array<string, string>>.
    +47: Options<array{name: string}> does not accept int.
    +
    +PHP 7.1 – 8.0 (5 errors)
    +==========
    +
    +45: Dumped type: string
    +46: Cannot assign offset 'name' to Options<array<string, string>>.
    +46: Options<array{name: string}> does not accept string.
    +47: Cannot assign offset 'name' to Options<array<string, string>>.
     47: Options<array{name: string}> does not accept int.
    Full report

    PHP 8.1 (6 errors)

    Line Error
    21 Return type mixed of method Options::offsetGet() is not covariant with tentative return type mixed of method ArrayAccess<key-of<TArray of array>,value-of<TArray of array>>::offsetGet().
    45 Dumped type: string
    46 Cannot assign offset 'name' to Options<array<string, string>>.
    46 Options<array{name: string}> does not accept string.
    47 Cannot assign offset 'name' to Options<array<string, string>>.
    47 Options<array{name: string}> does not accept int.

    PHP 7.1 – 8.0 (5 errors)

    Line Error
    45 Dumped type: string
    46 Cannot assign offset 'name' to Options<array<string, string>>.
    46 Options<array{name: string}> does not accept string.
    47 Cannot assign offset 'name' to Options<array<string, string>>.
    47 Options<array{name: string}> does not accept int.
  6. phpstan-bot commented on Sep 4, 2024

    @phpstan-bot
    Contributor

    @lulco After the latest push in 2.0.x, PHPStan now reports different result with your code snippet:

    @@ @@
    +PHP 8.1 (6 errors)
    +==========
    +
    +21: Return type mixed of method Options::offsetGet() is not covariant with tentative return type mixed of method ArrayAccess::offsetGet().
     45: Dumped type: string
    +46: Cannot assign offset 'name' to Options<array<string, string>>.
    +46: Options<array{name: string}> does not accept string.
    +47: Cannot assign offset 'name' to Options<array<string, string>>.
    +47: Options<array{name: string}> does not accept int.
    +
    +PHP 8.0 (5 errors)
    +==========
    +
    +45: Dumped type: string
    +46: Cannot assign offset 'name' to Options<array<string, string>>.
    +46: Options<array{name: string}> does not accept string.
    +47: Cannot assign offset 'name' to Options<array<string, string>>.
    +47: Options<array{name: string}> does not accept int.
    +
    +PHP 7.4 (24 errors)
    +==========
    +
    +14: PHPDoc tag @param for parameter $offset with type key-of<TArray of array> is incompatible with native type mixed.
    +14: Parameter #1 $offset (mixed) of method Options::offsetExists() is not contravariant with parameter #1 $offset (mixed) of method ArrayAccess::offsetExists().
    +14: Parameter $offset of method Options::offsetExists() has invalid type mixed.
    +21: PHPDoc tag @param for parameter $offset with type TOffset of key-of<TArray of array> is incompatible with native type mixed.
    +21: Parameter #1 $offset (mixed) of method Options::offsetGet() is not contravariant with parameter #1 $offset (mixed) of method ArrayAccess::offsetGet().
    +21: Parameter $offset of method Options::offsetGet() has invalid type mixed.
    +21: Template type TOffset of method Options::offsetGet() is not referenced in a parameter.
    +28: PHPDoc tag @param for parameter $offset with type TOffset of key-of<TArray of array> is incompatible with native type mixed.
    +28: PHPDoc tag @param for parameter $value with type TArray[TOffset] is not subtype of native type mixed.
    +28: Parameter #1 $offset (mixed) of method Options::offsetSet() is not contravariant with parameter #1 $offset (mixed) of method ArrayAccess::offsetSet().
    +28: Parameter #2 $value (mixed) of method Options::offsetSet() is not contravariant with parameter #2 $value (mixed) of method ArrayAccess::offsetSet().
    +28: Parameter $offset of method Options::offsetSet() has invalid type mixed.
    +28: Parameter $value of method Options::offsetSet() has invalid type mixed.
    +28: Template type TOffset of method Options::offsetSet() is not referenced in a parameter.
    +34: PHPDoc tag @param for parameter $offset with type TOffset of key-of<TArray of array> is incompatible with native type mixed.
    +34: Parameter #1 $offset (mixed) of method Options::offsetUnset() is not contravariant with parameter #1 $offset (mixed) of method ArrayAccess::offsetUnset().
    +34: Parameter $offset of method Options::offsetUnset() has invalid type mixed.
    +34: Template type TOffset of method Options::offsetUnset() is not referenced in a parameter.
    +45: Dumped type: string
    +45: Offset 'name' does not exist on Options<array{name: string}>.
    +46: Cannot assign offset 'name' to Options<array<string, string>>.
    +46: Options<array{name: string}> does not accept string.
    +47: Cannot assign offset 'name' to Options<array<string, string>>.
    +47: Options<array{name: string}> does not accept int.
    +
    +PHP 7.1 – 7.3 (24 errors)
    +==========
    +
    +14: PHPDoc tag @param for parameter $offset with type key-of<TArray of array> is incompatible with native type mixed.
    +14: Parameter #1 $offset (mixed) of method Options::offsetExists() is not compatible with parameter #1 $offset (mixed) of method ArrayAccess::offsetExists().
    +14: Parameter $offset of method Options::offsetExists() has invalid type mixed.
    +21: PHPDoc tag @param for parameter $offset with type TOffset of key-of<TArray of array> is incompatible with native type mixed.
    +21: Parameter #1 $offset (mixed) of method Options::offsetGet() is not compatible with parameter #1 $offset (mixed) of method ArrayAccess::offsetGet().
    +21: Parameter $offset of method Options::offsetGet() has invalid type mixed.
    +21: Template type TOffset of method Options::offsetGet() is not referenced in a parameter.
    +28: PHPDoc tag @param for parameter $offset with type TOffset of key-of<TArray of array> is incompatible with native type mixed.
    +28: PHPDoc tag @param for parameter $value with type TArray[TOffset] is not subtype of native type mixed.
    +28: Parameter #1 $offset (mixed) of method Options::offsetSet() is not compatible with parameter #1 $offset (mixed) of method ArrayAccess::offsetSet().
    +28: Parameter #2 $value (mixed) of method Options::offsetSet() is not compatible with parameter #2 $value (mixed) of method ArrayAccess::offsetSet().
    +28: Parameter $offset of method Options::offsetSet() has invalid type mixed.
    +28: Parameter $value of method Options::offsetSet() has invalid type mixed.
    +28: Template type TOffset of method Options::offsetSet() is not referenced in a parameter.
    +34: PHPDoc tag @param for parameter $offset with type TOffset of key-of<TArray of array> is incompatible with native type mixed.
    +34: Parameter #1 $offset (mixed) of method Options::offsetUnset() is not compatible with parameter #1 $offset (mixed) of method ArrayAccess::offsetUnset().
    +34: Parameter $offset of method Options::offsetUnset() has invalid type mixed.
    +34: Template type TOffset of method Options::offsetUnset() is not referenced in a parameter.
    +45: Dumped type: string
    +45: Offset 'name' does not exist on Options<array{name: string}>.
    +46: Cannot assign offset 'name' to Options<array<string, string>>.
    +46: Options<array{name: string}> does not accept string.
    +47: Cannot assign offset 'name' to Options<array<string, string>>.
     47: Options<array{name: string}> does not accept int.
    Full report

    PHP 8.1 (6 errors)

    Line Error
    21 Return type mixed of method Options::offsetGet() is not covariant with tentative return type mixed of method ArrayAccess::offsetGet().
    45 Dumped type: string
    46 Cannot assign offset 'name' to Options<array<string, string>>.
    46 Options<array{name: string}> does not accept string.
    47 Cannot assign offset 'name' to Options<array<string, string>>.
    47 Options<array{name: string}> does not accept int.

    PHP 8.0 (5 errors)

    Line Error
    45 Dumped type: string
    46 Cannot assign offset 'name' to Options<array<string, string>>.
    46 Options<array{name: string}> does not accept string.
    47 Cannot assign offset 'name' to Options<array<string, string>>.
    47 Options<array{name: string}> does not accept int.

    PHP 7.4 (24 errors)

    Line Error
    14 PHPDoc tag @param for parameter $offset with type key-of<TArray of array> is incompatible with native type mixed.
    14 Parameter #1 $offset (mixed) of method Options::offsetExists() is not contravariant with parameter #1 $offset (mixed) of method ArrayAccess::offsetExists().
    14 Parameter $offset of method Options::offsetExists() has invalid type mixed.
    21 PHPDoc tag @param for parameter $offset with type TOffset of key-of<TArray of array> is incompatible with native type mixed.
    21 Parameter #1 $offset (mixed) of method Options::offsetGet() is not contravariant with parameter #1 $offset (mixed) of method ArrayAccess::offsetGet().
    21 Parameter $offset of method Options::offsetGet() has invalid type mixed.
    21 Template type TOffset of method Options::offsetGet() is not referenced in a parameter.
    28 PHPDoc tag @param for parameter $offset with type TOffset of key-of<TArray of array> is incompatible with native type mixed.
    28 PHPDoc tag @param for parameter $value with type TArray[TOffset] is not subtype of native type mixed.
    28 Parameter #1 $offset (mixed) of method Options::offsetSet() is not contravariant with parameter #1 $offset (mixed) of method ArrayAccess::offsetSet().
    28 Parameter #2 $value (mixed) of method Options::offsetSet() is not contravariant with parameter #2 $value (mixed) of method ArrayAccess::offsetSet().
    28 Parameter $offset of method Options::offsetSet() has invalid type mixed.
    28 Parameter $value of method Options::offsetSet() has invalid type mixed.
    28 Template type TOffset of method Options::offsetSet() is not referenced in a parameter.
    34 PHPDoc tag @param for parameter $offset with type TOffset of key-of<TArray of array> is incompatible with native type mixed.
    34 Parameter #1 $offset (mixed) of method Options::offsetUnset() is not contravariant with parameter #1 $offset (mixed) of method ArrayAccess::offsetUnset().
    34 Parameter $offset of method Options::offsetUnset() has invalid type mixed.
    34 Template type TOffset of method Options::offsetUnset() is not referenced in a parameter.
    45 Dumped type: string
    45 Offset 'name' does not exist on Options<array{name: string}>.
    46 Cannot assign offset 'name' to Options<array<string, string>>.
    46 Options<array{name: string}> does not accept string.
    47 Cannot assign offset 'name' to Options<array<string, string>>.
    47 Options<array{name: string}> does not accept int.

    PHP 7.1 – 7.3 (24 errors)

    Line Error
    14 PHPDoc tag @param for parameter $offset with type key-of<TArray of array> is incompatible with native type mixed.
    14 Parameter #1 $offset (mixed) of method Options::offsetExists() is not compatible with parameter #1 $offset (mixed) of method ArrayAccess::offsetExists().
    14 Parameter $offset of method Options::offsetExists() has invalid type mixed.
    21 PHPDoc tag @param for parameter $offset with type TOffset of key-of<TArray of array> is incompatible with native type mixed.
    21 Parameter #1 $offset (mixed) of method Options::offsetGet() is not compatible with parameter #1 $offset (mixed) of method ArrayAccess::offsetGet().
    21 Parameter $offset of method Options::offsetGet() has invalid type mixed.
    21 Template type TOffset of method Options::offsetGet() is not referenced in a parameter.
    28 PHPDoc tag @param for parameter $offset with type TOffset of key-of<TArray of array> is incompatible with native type mixed.
    28 PHPDoc tag @param for parameter $value with type TArray[TOffset] is not subtype of native type mixed.
    28 Parameter #1 $offset (mixed) of method Options::offsetSet() is not compatible with parameter #1 $offset (mixed) of method ArrayAccess::offsetSet().
    28 Parameter #2 $value (mixed) of method Options::offsetSet() is not compatible with parameter #2 $value (mixed) of method ArrayAccess::offsetSet().
    28 Parameter $offset of method Options::offsetSet() has invalid type mixed.
    28 Parameter $value of method Options::offsetSet() has invalid type mixed.
    28 Template type TOffset of method Options::offsetSet() is not referenced in a parameter.
    34 PHPDoc tag @param for parameter $offset with type TOffset of key-of<TArray of array> is incompatible with native type mixed.
    34 Parameter #1 $offset (mixed) of method Options::offsetUnset() is not compatible with parameter #1 $offset (mixed) of method ArrayAccess::offsetUnset().
    34 Parameter $offset of method Options::offsetUnset() has invalid type mixed.
    34 Template type TOffset of method Options::offsetUnset() is not referenced in a parameter.
    45 Dumped type: string
    45 Offset 'name' does not exist on Options<array{name: string}>.
    46 Cannot assign offset 'name' to Options<array<string, string>>.
    46 Options<array{name: string}> does not accept string.
    47 Cannot assign offset 'name' to Options<array<string, string>>.
    47 Options<array{name: string}> does not accept int.
  7. phpstan-bot commented on Sep 23, 2024

    @phpstan-bot
    Contributor

    @lulco After the latest push in 2.0.x, PHPStan now reports different result with your code snippet:

    @@ @@
    +PHP 8.1 (6 errors)
    +==========
    +
    +21: Return type mixed of method Options::offsetGet() is not covariant with tentative return type mixed of method ArrayAccess<key-of<TArray of array>,value-of<TArray of array>>::offsetGet().
     45: Dumped type: string
    +46: Cannot assign offset 'name' to Options<array<string, string>>.
    +46: Options<array{name: string}> does not accept string.
    +47: Cannot assign offset 'name' to Options<array<string, string>>.
    +47: Options<array{name: string}> does not accept int.
    +
    +PHP 8.0 (5 errors)
    +==========
    +
    +45: Dumped type: string
    +46: Cannot assign offset 'name' to Options<array<string, string>>.
    +46: Options<array{name: string}> does not accept string.
    +47: Cannot assign offset 'name' to Options<array<string, string>>.
    +47: Options<array{name: string}> does not accept int.
    +
    +PHP 7.4 (24 errors)
    +==========
    +
    +14: PHPDoc tag @param for parameter $offset with type key-of<TArray of array> is incompatible with native type mixed.
    +14: Parameter #1 $offset (mixed) of method Options::offsetExists() is not contravariant with parameter #1 $offset (mixed) of method ArrayAccess<key-of<TArray of array>,value-of<TArray of array>>::offsetExists().
    +14: Parameter $offset of method Options::offsetExists() has invalid type mixed.
    +21: PHPDoc tag @param for parameter $offset with type TOffset of key-of<TArray of array> is incompatible with native type mixed.
    +21: Parameter #1 $offset (mixed) of method Options::offsetGet() is not contravariant with parameter #1 $offset (mixed) of method ArrayAccess<key-of<TArray of array>,value-of<TArray of array>>::offsetGet().
    +21: Parameter $offset of method Options::offsetGet() has invalid type mixed.
    +21: Template type TOffset of method Options::offsetGet() is not referenced in a parameter.
    +28: PHPDoc tag @param for parameter $offset with type TOffset of key-of<TArray of array> is incompatible with native type mixed.
    +28: PHPDoc tag @param for parameter $value with type TArray[TOffset] is not subtype of native type mixed.
    +28: Parameter #1 $offset (mixed) of method Options::offsetSet() is not contravariant with parameter #1 $offset (mixed) of method ArrayAccess<key-of<TArray of array>,value-of<TArray of array>>::offsetSet().
    +28: Parameter #2 $value (mixed) of method Options::offsetSet() is not contravariant with parameter #2 $value (mixed) of method ArrayAccess<key-of<TArray of array>,value-of<TArray of array>>::offsetSet().
    +28: Parameter $offset of method Options::offsetSet() has invalid type mixed.
    +28: Parameter $value of method Options::offsetSet() has invalid type mixed.
    +28: Template type TOffset of method Options::offsetSet() is not referenced in a parameter.
    +34: PHPDoc tag @param for parameter $offset with type TOffset of key-of<TArray of array> is incompatible with native type mixed.
    +34: Parameter #1 $offset (mixed) of method Options::offsetUnset() is not contravariant with parameter #1 $offset (mixed) of method ArrayAccess<key-of<TArray of array>,value-of<TArray of array>>::offsetUnset().
    +34: Parameter $offset of method Options::offsetUnset() has invalid type mixed.
    +34: Template type TOffset of method Options::offsetUnset() is not referenced in a parameter.
    +45: Dumped type: string
    +45: Offset 'name' does not exist on Options<array{name: string}>.
    +46: Cannot assign offset 'name' to Options<array<string, string>>.
    +46: Options<array{name: string}> does not accept string.
    +47: Cannot assign offset 'name' to Options<array<string, string>>.
    +47: Options<array{name: string}> does not accept int.
    +
    +PHP 7.1 – 7.3 (24 errors)
    +==========
    +
    +14: PHPDoc tag @param for parameter $offset with type key-of<TArray of array> is incompatible with native type mixed.
    +14: Parameter #1 $offset (mixed) of method Options::offsetExists() is not compatible with parameter #1 $offset (mixed) of method ArrayAccess<key-of<TArray of array>,value-of<TArray of array>>::offsetExists().
    +14: Parameter $offset of method Options::offsetExists() has invalid type mixed.
    +21: PHPDoc tag @param for parameter $offset with type TOffset of key-of<TArray of array> is incompatible with native type mixed.
    +21: Parameter #1 $offset (mixed) of method Options::offsetGet() is not compatible with parameter #1 $offset (mixed) of method ArrayAccess<key-of<TArray of array>,value-of<TArray of array>>::offsetGet().
    +21: Parameter $offset of method Options::offsetGet() has invalid type mixed.
    +21: Template type TOffset of method Options::offsetGet() is not referenced in a parameter.
    +28: PHPDoc tag @param for parameter $offset with type TOffset of key-of<TArray of array> is incompatible with native type mixed.
    +28: PHPDoc tag @param for parameter $value with type TArray[TOffset] is not subtype of native type mixed.
    +28: Parameter #1 $offset (mixed) of method Options::offsetSet() is not compatible with parameter #1 $offset (mixed) of method ArrayAccess<key-of<TArray of array>,value-of<TArray of array>>::offsetSet().
    +28: Parameter #2 $value (mixed) of method Options::offsetSet() is not compatible with parameter #2 $value (mixed) of method ArrayAccess<key-of<TArray of array>,value-of<TArray of array>>::offsetSet().
    +28: Parameter $offset of method Options::offsetSet() has invalid type mixed.
    +28: Parameter $value of method Options::offsetSet() has invalid type mixed.
    +28: Template type TOffset of method Options::offsetSet() is not referenced in a parameter.
    +34: PHPDoc tag @param for parameter $offset with type TOffset of key-of<TArray of array> is incompatible with native type mixed.
    +34: Parameter #1 $offset (mixed) of method Options::offsetUnset() is not compatible with parameter #1 $offset (mixed) of method ArrayAccess<key-of<TArray of array>,value-of<TArray of array>>::offsetUnset().
    +34: Parameter $offset of method Options::offsetUnset() has invalid type mixed.
    +34: Template type TOffset of method Options::offsetUnset() is not referenced in a parameter.
    +45: Dumped type: string
    +45: Offset 'name' does not exist on Options<array{name: string}>.
    +46: Cannot assign offset 'name' to Options<array<string, string>>.
    +46: Options<array{name: string}> does not accept string.
    +47: Cannot assign offset 'name' to Options<array<string, string>>.
     47: Options<array{name: string}> does not accept int.
    Full report

    PHP 8.1 (6 errors)

    Line Error
    21 Return type mixed of method Options::offsetGet() is not covariant with tentative return type mixed of method ArrayAccess<key-of<TArray of array>,value-of<TArray of array>>::offsetGet().
    45 Dumped type: string
    46 Cannot assign offset 'name' to Options<array<string, string>>.
    46 Options<array{name: string}> does not accept string.
    47 Cannot assign offset 'name' to Options<array<string, string>>.
    47 Options<array{name: string}> does not accept int.

    PHP 8.0 (5 errors)

    Line Error
    45 Dumped type: string
    46 Cannot assign offset 'name' to Options<array<string, string>>.
    46 Options<array{name: string}> does not accept string.
    47 Cannot assign offset 'name' to Options<array<string, string>>.
    47 Options<array{name: string}> does not accept int.

    PHP 7.4 (24 errors)

    Line Error
    14 PHPDoc tag @param for parameter $offset with type key-of<TArray of array> is incompatible with native type mixed.
    14 Parameter #1 $offset (mixed) of method Options::offsetExists() is not contravariant with parameter #1 $offset (mixed) of method ArrayAccess<key-of<TArray of array>,value-of<TArray of array>>::offsetExists().
    14 Parameter $offset of method Options::offsetExists() has invalid type mixed.
    21 PHPDoc tag @param for parameter $offset with type TOffset of key-of<TArray of array> is incompatible with native type mixed.
    21 Parameter #1 $offset (mixed) of method Options::offsetGet() is not contravariant with parameter #1 $offset (mixed) of method ArrayAccess<key-of<TArray of array>,value-of<TArray of array>>::offsetGet().
    21 Parameter $offset of method Options::offsetGet() has invalid type mixed.
    21 Template type TOffset of method Options::offsetGet() is not referenced in a parameter.
    28 PHPDoc tag @param for parameter $offset with type TOffset of key-of<TArray of array> is incompatible with native type mixed.
    28 PHPDoc tag @param for parameter $value with type TArray[TOffset] is not subtype of native type mixed.
    28 Parameter #1 $offset (mixed) of method Options::offsetSet() is not contravariant with parameter #1 $offset (mixed) of method ArrayAccess<key-of<TArray of array>,value-of<TArray of array>>::offsetSet().
    28 Parameter #2 $value (mixed) of method Options::offsetSet() is not contravariant with parameter #2 $value (mixed) of method ArrayAccess<key-of<TArray of array>,value-of<TArray of array>>::offsetSet().
    28 Parameter $offset of method Options::offsetSet() has invalid type mixed.
    28 Parameter $value of method Options::offsetSet() has invalid type mixed.
    28 Template type TOffset of method Options::offsetSet() is not referenced in a parameter.
    34 PHPDoc tag @param for parameter $offset with type TOffset of key-of<TArray of array> is incompatible with native type mixed.
    34 Parameter #1 $offset (mixed) of method Options::offsetUnset() is not contravariant with parameter #1 $offset (mixed) of method ArrayAccess<key-of<TArray of array>,value-of<TArray of array>>::offsetUnset().
    34 Parameter $offset of method Options::offsetUnset() has invalid type mixed.
    34 Template type TOffset of method Options::offsetUnset() is not referenced in a parameter.
    45 Dumped type: string
    45 Offset 'name' does not exist on Options<array{name: string}>.
    46 Cannot assign offset 'name' to Options<array<string, string>>.
    46 Options<array{name: string}> does not accept string.
    47 Cannot assign offset 'name' to Options<array<string, string>>.
    47 Options<array{name: string}> does not accept int.

    PHP 7.1 – 7.3 (24 errors)

    Line Error
    14 PHPDoc tag @param for parameter $offset with type key-of<TArray of array> is incompatible with native type mixed.
    14 Parameter #1 $offset (mixed) of method Options::offsetExists() is not compatible with parameter #1 $offset (mixed) of method ArrayAccess<key-of<TArray of array>,value-of<TArray of array>>::offsetExists().
    14 Parameter $offset of method Options::offsetExists() has invalid type mixed.
    21 PHPDoc tag @param for parameter $offset with type TOffset of key-of<TArray of array> is incompatible with native type mixed.
    21 Parameter #1 $offset (mixed) of method Options::offsetGet() is not compatible with parameter #1 $offset (mixed) of method ArrayAccess<key-of<TArray of array>,value-of<TArray of array>>::offsetGet().
    21 Parameter $offset of method Options::offsetGet() has invalid type mixed.
    21 Template type TOffset of method Options::offsetGet() is not referenced in a parameter.
    28 PHPDoc tag @param for parameter $offset with type TOffset of key-of<TArray of array> is incompatible with native type mixed.
    28 PHPDoc tag @param for parameter $value with type TArray[TOffset] is not subtype of native type mixed.
    28 Parameter #1 $offset (mixed) of method Options::offsetSet() is not compatible with parameter #1 $offset (mixed) of method ArrayAccess<key-of<TArray of array>,value-of<TArray of array>>::offsetSet().
    28 Parameter #2 $value (mixed) of method Options::offsetSet() is not compatible with parameter #2 $value (mixed) of method ArrayAccess<key-of<TArray of array>,value-of<TArray of array>>::offsetSet().
    28 Parameter $offset of method Options::offsetSet() has invalid type mixed.
    28 Parameter $value of method Options::offsetSet() has invalid type mixed.
    28 Template type TOffset of method Options::offsetSet() is not referenced in a parameter.
    34 PHPDoc tag @param for parameter $offset with type TOffset of key-of<TArray of array> is incompatible with native type mixed.
    34 Parameter #1 $offset (mixed) of method Options::offsetUnset() is not compatible with parameter #1 $offset (mixed) of method ArrayAccess<key-of<TArray of array>,value-of<TArray of array>>::offsetUnset().
    34 Parameter $offset of method Options::offsetUnset() has invalid type mixed.
    34 Template type TOffset of method Options::offsetUnset() is not referenced in a parameter.
    45 Dumped type: string
    45 Offset 'name' does not exist on Options<array{name: string}>.
    46 Cannot assign offset 'name' to Options<array<string, string>>.
    46 Options<array{name: string}> does not accept string.
    47 Cannot assign offset 'name' to Options<array<string, string>>.
    47 Options<array{name: string}> does not accept int.
  8. nyamsprod commented on Jul 18, 2026

    @nyamsprod

    Is the following snippet also a consequence of this bug or can this be consider a feature request ?

    ArrayAccess does not support Array Shape

  9. westonruter commented on Nov 2, 2026

    @westonruter
    SponsorContributor

    I've opened phpstan/phpstan-src#6903 to fix this issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions