Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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‎

Lines changed: 20 additions & 0 deletions
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‎

Lines changed: 7 additions & 7 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /