psalm
psalm copied to clipboard
How to test against class-string<Foo> if the class might not exist yet?
In newer Dbal4 Version, InvalidType extends ConversionException
but the test against older version fails
https://psalm.dev/r/32dcca1a1b
using this causes even more problems because it now thinks that class_exists doesn't apply
if (class_exists(InvalidType::class) && is_a(InvalidType::class, \Throwable::class, true)) {
https://psalm.dev/r/5a6e7e25e5
with this, it's fewer problems again, but we are back at the start
if (class_exists(InvalidType::class))
if (is_a(InvalidType::class, \Throwable::class, true)) {
expectException(InvalidType::class);
}
https://psalm.dev/r/8b557386cf
I found these snippets:
https://psalm.dev/r/32dcca1a1b
<?php
/**
* @param class-string<Throwable> $class
*/
function expectException(string $class): string {return $class;}
class ConversionException extends Exception
{
}
/**
* class InvalidType extends ConversionException {
}
*/
expectException(ConversionException::class);
if (class_exists(InvalidType::class)) {
expectException(InvalidType::class);
}
Psalm output (using commit 16b24bd):
ERROR: InvalidArgument - 20:19 - Argument 1 of expectException expects class-string<Throwable>, but InvalidType::class provided
https://psalm.dev/r/5a6e7e25e5
<?php
/**
* @param class-string<Throwable> $class
*/
function expectException(string $class): string {return $class;}
class ConversionException extends Exception
{
}
/**
* class InvalidType extends ConversionException {
}
*/
expectException(ConversionException::class);
if (class_exists(InvalidType::class) && is_a(InvalidType::class, \Throwable::class, true)) {
expectException(InvalidType::class);
}
Psalm output (using commit 16b24bd):
ERROR: UndefinedClass - 19:46 - Class, interface or enum named InvalidType does not exist
ERROR: UndefinedClass - 20:20 - Class, interface or enum named InvalidType does not exist
INFO: MixedArgument - 20:20 - Argument 1 of expectException cannot be mixed, expecting class-string<Throwable>
https://psalm.dev/r/8b557386cf
<?php
/**
* @param class-string<Throwable> $class
*/
function expectException(string $class): string {return $class;}
class ConversionException extends Exception
{
}
/**
* class InvalidType extends ConversionException {
}
*/
expectException(ConversionException::class);
if (class_exists(InvalidType::class))
if (is_a(InvalidType::class, \Throwable::class, true)) {
expectException(InvalidType::class);
}
Psalm output (using commit 16b24bd):
ERROR: InvalidArgument - 21:25 - Argument 1 of expectException expects class-string<Throwable>, but InvalidType::class provided