rfc:flexible_heredoc_nowdoc_syntaxes
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revisionNext revisionBoth sides next revision | ||
rfc:flexible_heredoc_nowdoc_syntaxes [2017/09/16 16:26] – created tpunt | rfc:flexible_heredoc_nowdoc_syntaxes [2017/09/27 10:43] – tpunt | ||
---|---|---|---|
Line 39: | Line 39: | ||
// no indentation | // no indentation | ||
echo <<< | echo <<< | ||
- | a | + | |
- | b | + | |
- | c | + | c |
END; | END; | ||
/* | /* | ||
- | a | + | |
- | b | + | |
- | c | + | c |
*/ | */ | ||
- | // 1 space of indentation | + | // 4 spaces |
echo <<< | echo <<< | ||
- | a | + | |
- | b | + | |
- | c | + | c |
- | END; | + | END; |
/* | /* | ||
a | a | ||
b | b | ||
- | c | ||
- | */ | ||
- | |||
- | // 2 spaces of indentation | ||
- | echo <<< | ||
- | a | ||
- | b | ||
- | c | ||
- | END; | ||
- | /* | ||
- | a | ||
- | b | ||
- | c | ||
- | */ | ||
- | |||
- | // 3 (or more) spaces of indentation | ||
- | echo <<< | ||
- | a | ||
- | b | ||
- | c | ||
- | END; | ||
- | /* | ||
- | a | ||
- | b | ||
c | c | ||
*/ | */ | ||
</ | </ | ||
- | Tabs are supported as well. If tabs and spaces are intermixed (for whatever reason...), then each space and each tab is considered as 1 indentation. So if the closing marker is indented | + | If the closing marker is indented |
<code php> | <code php> | ||
- | // 1 tab indentation | + | |
echo <<< | echo <<< | ||
- | a | ||
- | b | ||
- | c | ||
- | END; | ||
- | /* | ||
a | a | ||
b | b | ||
c | c | ||
- | */ | + | |
+ | |||
+ | // Parse error: Invalid body indentation level (expecting an indentation at least 5) in %s on line %d | ||
</ | </ | ||
- | Moral of the story: don't mix tabs and spaces... | + | Tabs are supported as well, however, tabs and spaces **must not** be intermixed regarding the indentation |
+ | <code php> | ||
+ | // different indentation for body (spaces) ending marker (tabs) | ||
+ | { | ||
+ | echo <<< | ||
+ | a | ||
+ | END; | ||
+ | } | ||
+ | |||
+ | // mixing spaces | ||
+ | { | ||
+ | echo <<< | ||
+ | a | ||
+ | | ||
+ | } | ||
+ | |||
+ | // mixing | ||
+ | { | ||
+ | echo <<< | ||
+ | a | ||
+ | END; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | These whitespace constraints have been included because mixing tabs and spaces for indentation is harmful to legibility. | ||
==== Closing Marker New Line ==== | ==== Closing Marker New Line ==== | ||
+ | Currently, in order to terminate a heredoc or nowdoc, a new line **must** be used after the closing marker (with the option | ||
Removing the closing marker requirement will change code from: | Removing the closing marker requirement will change code from: | ||
<code php> | <code php> | ||
Line 151: | Line 149: | ||
The implementation I am proposing avoids this problem by checking to see if a continuation of the found marker exists, and if so, then if it forms a valid identifier. This means that the terminating marker string will only be considered as such if it is matched exactly as a standalone, valid symbol (that is also found at the start of the line). This enables for the above snippet to now work. | The implementation I am proposing avoids this problem by checking to see if a continuation of the found marker exists, and if so, then if it forms a valid identifier. This means that the terminating marker string will only be considered as such if it is matched exactly as a standalone, valid symbol (that is also found at the start of the line). This enables for the above snippet to now work. | ||
- | Something | + | Examples |
<code php> | <code php> | ||
$values = [<<< | $values = [<<< | ||
Line 160: | Line 158: | ||
/* | /* | ||
Parse error: syntax error, unexpected ' | Parse error: syntax error, unexpected ' | ||
+ | */ | ||
+ | |||
+ | echo <<< | ||
+ | END{$var} | ||
+ | END; | ||
+ | /* | ||
+ | Parse error: syntax error, unexpected ' | ||
*/ | */ | ||
</ | </ | ||
- | (Notice the space after the first '' | + | There is not a great deal that can be done about this. So the simple rule is: **do not choose a marker that appears in the body of the text** (though it would specifically have to occur at the start of a line in the text to cause problems). |
===== Backward Incompatible Changes ===== | ===== Backward Incompatible Changes ===== | ||
Line 181: | Line 186: | ||
{ | { | ||
stringManipulator(<<< | stringManipulator(<<< | ||
- | a | + | a |
- | b | + | b |
- | | + | c |
END | END | ||
); | ); |
rfc/flexible_heredoc_nowdoc_syntaxes.txt · Last modified: 2018/04/13 19:59 by nikic