I was surprised when I run the following code in my editor:
<?php
echo "hello";
echo "world"
?>
As you can see, the code is missing a semicolon (;), but it still works!
Does anyone know how this works and why ; is {0,1} here?.
I was surprised when I run the following code in my editor:
<?php
echo "hello";
echo "world"
?>
As you can see, the code is missing a semicolon (;), but it still works!
Does anyone know how this works and why ; is {0,1} here?.
Because the close tag implies a semicolon. You can read more about this in the manual under Instruction separation.
And a quote from there:
As in C or Perl, PHP requires instructions to be terminated with a semicolon at the end of each statement. The closing tag of a block of PHP code automatically implies a semicolon; you do not need to have a semicolon terminating the last line of a PHP block. The closing tag for the block will include the immediately trailing newline if one is present.
An example to prove this:
1. script with missing semicolon at the end, but with closing tag:
<?php
echo "1";
echo "2"
//^ semicolon missing
?>
output:
12
2. script with missing semicolon at the end, but without closing tag:
<?php
echo "1";
echo "2"
//^ semicolon missing (closing tag missing)
output:
Parse error: syntax error, unexpected end of file, expecting ',' or ';' in
Because the semicolon tells the parser that you've reached the end of that instruction. It lets it know that the next piece of text is a new instruction. However the closing tag tells it that we're at the end of all instructions, you don't need to parse anything else. Because we're not parsing anything else we don't need the end of instruction semicolon, it's implied.
That is because the semicolon is not a symbol to terminate a statement.
It looks like that because it occurs almost always at the end of a statement.
Note the almost always... could be a hint.
Trying to get rid of the asymmetry, we can say it is always between statements!
That leads directly to the real meaning of the semicolon: it does not terminate statements - it separates statements.
Obviously, after the last statement, there is nothing to separate.
(Most languages allow a semicolon at the end of a block anyway, to prevent the related trivial errors. It can be done by discarding the semicolon, or, more explicit, by inserting a command that does nothing after the semicolon. )