-
-
Notifications
You must be signed in to change notification settings - Fork 870
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Support for array shape for ArrayAccess classes not working. #8549
Comments
Broke in this PR: phpstan/phpstan-src#1623 |
@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 reportPHP 8.1 (6 errors)
PHP 7.1 – 8.0 (5 errors)
|
I take a look at this and:
@rvanvelzen Since both of the PR were made by you, can you help me on this ? |
@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 reportPHP 8.1 (6 errors)
PHP 7.1 – 8.0 (5 errors)
|
@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 reportPHP 8.1 (6 errors)
PHP 8.0 (5 errors)
PHP 7.4 (24 errors)
PHP 7.1 – 7.3 (24 errors)
|
@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 reportPHP 8.1 (6 errors)
PHP 8.0 (5 errors)
PHP 7.4 (24 errors)
PHP 7.1 – 7.3 (24 errors)
|
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.
The text was updated successfully, but these errors were encountered: