Am 15.3.2013 um 18:57 schrieb Stas Malyshev <smalys...@sugarcrm.com>:

> Hi!
> 
>> why not enable then this "getCallback()();"?
> 
> There's an RFC for that: https://wiki.php.net/rfc/fcallfcall
> but it has some edge cases which I didn't have time to figure out yet.

Is it possible to add this alternative rule for function_call in 
zend_language_parser.y:
parenthesis_expr { zend_do_begin_dynamic_function_call(&$1, 0 TSRMLS_CC); }
function_call_parameter_list { zend_do_end_function_call(&$1, &$$, &$3, 0, 
$2.u.op.opline_num TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C); }

So that you can write ($this->closure)(); (for invoking Closures instead of 
first assigning it, then calling the Closure or writing 
$this->closure->invoke())

Or write (getCallback())(). There should be then no edge cases as it is 
properly delimited by the parenthesis.

I've shortly tested this with no new bugs.

Short example:
function a () { return "b"; }
function b () { return "c"; }
print (a())()."\n"; // prints c

function a () { return function () { print "a\n"; }; }
(a())(); // prints a

I also think this with parenthesis around it it is clearer what's being done: 
the first part evaluated and then the second executed. (If I would have to 
choose I would prefer the parenthesis...)


Bob Weinand

p.s.: I'm wondering why, with this little patch, (function () { print "a"; 
})(); is throwing a fatal error telling me a function name must be a string 
while ($temp = function () { print "a"; })(); is working perfectly?! (I think 
this is the condition which fails: 
http://lxr.php.net/xref/PHP_TRUNK/Zend/zend_vm_def.h#2676, but I'm not 100% 
sure and now I'm too tired to investigate further into it...)
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to