0
<?php
declare(strict_types=1);
$a = 1;
$b = 2;
function FunctionName(int $a, int $b)
{
    $c = '10'; //string
    return $a + $b + $c;
}
echo FunctionName($a, $b);
?>

I expected FunctionName($a, $b) will print an error, but it does not print an error message.

As you can see, I added a string($c) to an int($a+$b), and declared strict_types=1.

why can't I get an error message?

Saturn
  • 55
  • 10
  • `declare(strict_types=1);` not possible – Alive to die - Anant Aug 02 '17 at 18:03
  • @AlivetoDie could you explain me why is it impossible? – Saturn Aug 02 '17 at 18:11
  • given in the duplicate link already:- https://stackoverflow.com/questions/37111470/enabling-strict-types-globally-in-php-7 – Alive to die - Anant Aug 02 '17 at 18:12
  • @AlivetoDie I think you have misunderstood the question you linked to. That user was asking if they could automatically enable this directive across all files (which you can't); enabling it at the top of one file is exactly what you *can* do, and the code in this question is perfectly valid. – IMSoP Aug 11 '17 at 11:50

1 Answers1

2

"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 ints to a function expecting two ints, 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'
IMSoP
  • 89,526
  • 13
  • 117
  • 169