So I was using create_function() in various ways, and I said to myself, "this would look SO much better if I could use a heredoc that acted like a single-quoted string". Then I said to myself, "Wait. I know the PHP internals. Why don't I build a new syntax into the language?" The result was a small modification of the heredoc syntax that I call "nowdoc", and it looks like this:

<?php
$n = 1;

$a = <<<ENDOFHERE
I see $n.
ENDOFHERE;

$b = <<<~ENDOFNOW
I see $n.
ENDOFNOW;

print "{$a}\n{$b}\n";

?>

And the output is:

I see 1.
I see $n.

The b modifier is fully supported; a nowdoc acts exactly like a single-quoted string, save that you can embed single quotes into it. I wrote the patch for HEAD, backported it to PHP_5_2 (both fully up- to-date as of this message), and wrote a set of regression tests. The patch breaks none of the existing regression tests, and has no BC or SC breaks whatsoever, as far as I can tell. The patch can be found at <http://phpdoc.gwynne.dyndns.org/nowdocs.tar.gz>. I hope to see it included in PHP 6 and 5.3, maybe even 5.2.4 or 5.2.5 since existing scripts will continue to work without modification. <<<~ was a parse error before, so anyone who used it was doing something wrong anyway.

Side note: I implemented nowdocs in the parser by sharing the heredoc code and passing $ and {$ through unmodified instead of replaced. I don't understand the way the HEREDOC_CHARS regexps work well enough to write a simpler matching rule for the newdocs, but it's clear that the patch could be optimized if only I knew how, since the entire content can be parsed by a single call to zend_scan_[unicode|binary_] escape_string() rather than having to be parsed for replacements. I may look into this later, but for the moment I wanted to get what's working out there in the commmunity.

-- Gwynne, Daughter of the Code
"This whole world is an asylum for the incurable."

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to