Skip to content

Commit

Permalink
Support float -> int and bool|float|int|null -> string cast v…
Browse files Browse the repository at this point in the history
…ia `filter_var()`
  • Loading branch information
herndlm committed Dec 27, 2022
1 parent 63adbba commit c17b58e
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 1 deletion.
8 changes: 8 additions & 0 deletions src/Type/Php/FilterVarDynamicReturnTypeExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,14 @@ private function determineExactType(Type $in, int $filterValue, Type $defaultTyp
return $in->toFloat();
}

if ($filterValue === $this->getConstant('FILTER_VALIDATE_INT') && $in->isFloat()->yes()) {
return $in->toInteger();
}

if ($filterValue === $this->getConstant('FILTER_DEFAULT') && ($in->isBoolean()->yes() || $in->isFloat()->yes() || $in->isInteger()->yes() || $in->isNull()->yes())) {
return $in->toString();
}

return null;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,10 @@ public function run(string $str, int $int, int $positive_int, int $negative_int)
assertType('9', $return);

$return = filter_var(1.0, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1, 'max_range' => 9]]);
assertType('int<1, 9>|false', $return);
assertType('1', $return);

$return = filter_var(11.0, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1, 'max_range' => 9]]);
assertType('false', $return);

$return = filter_var($str, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1, 'max_range' => $positive_int]]);
assertType('int<1, max>|false', $return);
Expand Down
9 changes: 9 additions & 0 deletions tests/PHPStan/Analyser/data/filter-var.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,16 @@ public function intToInt(int $int, array $options): void
public function constants(): void
{
assertType('array<false>', filter_var(false, FILTER_VALIDATE_BOOLEAN, FILTER_FORCE_ARRAY | FILTER_NULL_ON_FAILURE));

assertType('17', filter_var(17, FILTER_VALIDATE_INT));

assertType('17.0', filter_var(17, FILTER_VALIDATE_FLOAT));

assertType("'17'", filter_var(17));
assertType("'17'", filter_var(17.0));
assertType("'1'", filter_var(true));
assertType("''", filter_var(false));
assertType("''", filter_var(null));
}

}

0 comments on commit c17b58e

Please sign in to comment.