Edit report at http://bugs.php.net/bug.php?id=54367&edit=1
ID: 54367 Updated by: fel...@php.net Reported by: jpa...@php.net Summary: Use of closure causes problem in ArrayAccess -Status: Open +Status: Assigned Type: Bug Package: Scripting Engine problem Operating System: *nix PHP Version: 5.3.6 -Assigned To: +Assigned To: dmitry Block user comment: N Private report: N New Comment: I can reproduce a crash with: <?php class MyObjet implements ArrayAccess { public function __construct() { } public function offsetSet($offset, $value) { } public function offsetExists($offset) { } public function offsetUnset($offset) { } public function offsetGet ($offset) { return function () { }; } } $a = new MyObjet(); echo $a['p']('foo'); ?> Breakpoint 1, 0x085368b3 in ZEND_SEND_VAL_SPEC_CONST_HANDLER (execute_data=0x8ade614, tsrm_ls=0x89022a0) at /home/felipe/dev/php5/Zend/zend_vm_execute.h:1719 1719 && ARG_MUST_BE_SENT_BY_REF(EX(fbc), opline->op2.u.opline_num)) { (gdb) p execute_data->fbc->common $7 = {type = 90 'Z', function_name = 0x5a5a5a5a <Address 0x5a5a5a5a out of bounds>, scope = 0x5a5a5a5a, fn_flags = 1515870810, prototype = 0x5a5a5a5a, num_args = 1515870810, required_num_args = 1515870810, arg_info = 0x5a5a5a5a, pass_rest_by_reference = 90 'Z', return_reference = 90 'Z'} Previous Comments: ------------------------------------------------------------------------ [2011-03-24 13:52:23] jpa...@php.net Description: ------------ Closures cant use variables from external context when the context is in ArrayAccess method Test script: --------------- <?php class MyObjet implements ArrayAccess { // All the stuff for ArrayAccess public function offsetGet ($offset) { return function ($var) use ($offset) { // here is the problem return sprintf('<%s>%s</%$1s>', $offset, $var); }; } } $a = new MyObjet(); echo $a['p']('foo'); Expected result: ---------------- <p>foo</p> Actual result: -------------- PHP Notice: Undefined variable: offset in {file.php} on line 11 ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/bug.php?id=54367&edit=1