"Strict types" mode only checks types at specific points in the code; it does not track everything that happens to the variable.
Specifically, it checks:
- the parameters given to the function, if type hints are included in the signature; here you are giving two
int
s to a function expecting two int
s, so there is no error
- the return value of the function, if a return type hint is included in the signature; here you have no type hint, but if you had a hint of
: int
, there would still be no error, because the result of $a + $b + $c
is indeed an int
.
Here are some examples that do give errors:
declare(strict_types=1);
$a = '1';
$b = '2';
function FunctionName(int $a, int $b)
{
return $a + $b;
}
echo FunctionName($a, $b);
// TypeError: Argument 1 passed to FunctionName() must be of the type integer, string given
Or for a return hint:
declare(strict_types=1);
$a = 1;
$b = 2;
function FunctionName(int $a, int $b): int
{
return $a . ' and ' . $b;
}
echo FunctionName($a, $b);
// TypeError: Return value of FunctionName() must be of the type integer, string returned
Note that in the second example, it is not the fact that we calculated $a . ' and ' . $b
that throws the error, it's the fact that we returned that string, but our promise was to return an integer. The following will not give an error:
declare(strict_types=1);
$a = 1;
$b = 2;
function FunctionName(int $a, int $b): int
{
return strlen( $a . ' and ' . $b );
}
echo FunctionName($a, $b);
// Outputs '7'