Change yield interpolation behaviour

From: Date: Fri, 08 Oct 2021 09:14:13 +0000
Subject: Change yield interpolation behaviour
Groups: php.internals 
Request: Send a blank email to internals+get-116247@lists.php.net to get a copy of this message
  Hello Internals! At the moment, there is a feature/bug in the PHP that allows to use interpolation of generators. ``` $code = <<<EXAMPLE      Hello ${yield} EXAMPLE; ``` I suspect that initially this functionality was not thought out, but it partially works, which allows you to implement useful functionality. ``` [$query, $params] = sql(fn() => <<<SQL      SELECT * FROM users WHERE id = ${yield 42} OR id = ${yield 0xDEADBEEF} SQL); // Expected // $query = "SELECT * FROM users WHERE id = ? OR id = ?" // $params = [ 42, 0xDEADBEEF ] ``` When I say that the functionality was not thought out initially, I mean the behavior of generators within strings. For example, the following code, which should (seemingly) implement this functionality: ``` function sql(\Closure $expr) {      [$generator, $params] = [$expr(), $params];      while ($generator->valid()) {         $params[] = $generator->current(); // Get the value from "yield"         $generator->send('?'); // Insert placeholder      }      return [$generator->getReturn(), $params]; } ``` Causes an error: ``` Warning: Undefined variable $? ``` That is, the expression "${yield 42}" expects back not the result of this expression, but the name of the variable. Therefore, a complete and workable implementation of such a functionality is as follows: https://gist.github.com/SerafimArts/2e7702620480fbce6c24bc87bfb9cb0e I think it makes sense to do something about it. I have two suggestions: 1) Forbid using "yield" inside strings 2) Expect not a variable name as a result of this expression, but a substitution value. What do you think? -- Kirill Nesmeyanov

« previous php.internals (#116247) next »