Search code examples
phpstringconcatenationoperator-keywordoperator-precedence

PHP string number concatenation messed up


I got some PHP code here:

<?php
    echo 'hello ' . 1 + 2 . '34';
?>

which outputs 234,

But when I add a number 11 before "hello":

<?php
    echo '11hello ' . 1 + 2 . '34';
?>

It outputs 1334 rather than 245 (which I expected it to). Why is that?


Solution

  • That's strange...

    But

    <?php
        echo '11hello ' . (1 + 2) . '34';
    ?>
    

    or

    <?php
        echo '11hello ', 1 + 2, '34';
    ?>
    

    fixes the issue.


    UPDATE v1:

    I finally managed to get the proper answer:

    'hello' = 0 (contains no leading digits, so PHP assumes it is zero).

    So 'hello' . 1 + 2 simplifies to 'hello1' + 2 is 2. Because there aren't any leading digits in 'hello1' it is zero too.


    '11hello ' = 11 (contains leading digits, so PHP assumes it is eleven).

    So '11hello ' . 1 + 2 simplifies to '11hello 1' + 2 as 11 + 2 is 13.


    UPDATE v2:

    From Strings:

    The value is given by the initial portion of the string. If the string starts with valid numeric data, this will be the value used. Otherwise, the value will be 0 (zero). Valid numeric data is an optional sign, followed by one or more digits (optionally containing a decimal point), followed by an optional exponent. The exponent is an 'e' or 'E' followed by one or more digits.