Skip to content

Commit 606bcbf

Browse files
herndlmondrejmirtes
authored andcommitted
Improve filter_var() handling of a couple of simple scalars and null
1 parent 992f735 commit 606bcbf

File tree

2 files changed

+27
-7
lines changed

2 files changed

+27
-7
lines changed

src/Type/Php/FilterFunctionReturnTypeHelper.php

+20
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,10 @@ private function determineExactType(Type $in, int $filterValue, Type $defaultTyp
186186
if ($in->isBoolean()->yes()) {
187187
return $in;
188188
}
189+
190+
if ($in->isNull()->yes()) {
191+
return $defaultType;
192+
}
189193
}
190194

191195
if ($filterValue === $this->getConstant('FILTER_VALIDATE_FLOAT')) {
@@ -196,13 +200,29 @@ private function determineExactType(Type $in, int $filterValue, Type $defaultTyp
196200
if ($in->isInteger()->yes()) {
197201
return $in->toFloat();
198202
}
203+
204+
if ($in->isTrue()->yes()) {
205+
return new ConstantFloatType(1);
206+
}
207+
208+
if ($in->isFalse()->yes() || $in->isNull()->yes()) {
209+
return $defaultType;
210+
}
199211
}
200212

201213
if ($filterValue === $this->getConstant('FILTER_VALIDATE_INT')) {
202214
if ($in->isInteger()->yes()) {
203215
return $in;
204216
}
205217

218+
if ($in->isTrue()->yes()) {
219+
return new ConstantIntegerType(1);
220+
}
221+
222+
if ($in->isFalse()->yes() || $in->isNull()->yes()) {
223+
return $defaultType;
224+
}
225+
206226
if ($in instanceof ConstantFloatType) {
207227
return $in->getValue() - (int) $in->getValue() <= PHP_FLOAT_EPSILON
208228
? $in->toInteger()

tests/PHPStan/Analyser/data/filter-var.php

+7-7
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,11 @@ public function scalars(bool $bool, float $float, int $int, string $string, int
8181
assertType('bool|null', filter_var($nonEmptyString, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE));
8282
assertType('bool|null', filter_var('17', FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); // could be null
8383
assertType('bool|null', filter_var('17.1', FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); // could be null
84-
assertType('bool|null', filter_var(null, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); // could be null
84+
assertType('null', filter_var(null, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE));
8585

8686
assertType('float|false', filter_var($bool, FILTER_VALIDATE_FLOAT));
87-
assertType('float|false', filter_var(true, FILTER_VALIDATE_FLOAT)); // could be 1
88-
assertType('float|false', filter_var(false, FILTER_VALIDATE_FLOAT)); // could be false
87+
assertType('1.0', filter_var(true, FILTER_VALIDATE_FLOAT));
88+
assertType('false', filter_var(false, FILTER_VALIDATE_FLOAT));
8989
assertType('float', filter_var($float, FILTER_VALIDATE_FLOAT));
9090
assertType('17.0', filter_var(17.0, FILTER_VALIDATE_FLOAT));
9191
assertType('17.1', filter_var(17.1, FILTER_VALIDATE_FLOAT));
@@ -96,11 +96,11 @@ public function scalars(bool $bool, float $float, int $int, string $string, int
9696
assertType('float|false', filter_var($nonEmptyString, FILTER_VALIDATE_FLOAT));
9797
assertType('float|false', filter_var('17', FILTER_VALIDATE_FLOAT)); // could be 17.0
9898
assertType('float|false', filter_var('17.1', FILTER_VALIDATE_FLOAT)); // could be 17.1
99-
assertType('float|false', filter_var(null, FILTER_VALIDATE_FLOAT)); // could be false
99+
assertType('false', filter_var(null, FILTER_VALIDATE_FLOAT));
100100

101101
assertType('int|false', filter_var($bool, FILTER_VALIDATE_INT));
102-
assertType('int|false', filter_var(true, FILTER_VALIDATE_INT)); // could be 1
103-
assertType('int|false', filter_var(false, FILTER_VALIDATE_INT)); // could be false
102+
assertType('1', filter_var(true, FILTER_VALIDATE_INT));
103+
assertType('false', filter_var(false, FILTER_VALIDATE_INT));
104104
assertType('int|false', filter_var($float, FILTER_VALIDATE_INT));
105105
assertType('17', filter_var(17.0, FILTER_VALIDATE_INT));
106106
assertType('false', filter_var(17.1, FILTER_VALIDATE_INT));
@@ -111,7 +111,7 @@ public function scalars(bool $bool, float $float, int $int, string $string, int
111111
assertType('int|false', filter_var($nonEmptyString, FILTER_VALIDATE_INT));
112112
assertType('17', filter_var('17', FILTER_VALIDATE_INT));
113113
assertType('false', filter_var('17.1', FILTER_VALIDATE_INT));
114-
assertType('int|false', filter_var(null, FILTER_VALIDATE_INT)); // could be false
114+
assertType('false', filter_var(null, FILTER_VALIDATE_INT));
115115

116116
assertType("''|'1'", filter_var($bool));
117117
assertType("'1'", filter_var(true));

0 commit comments

Comments
 (0)