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

Reply via email to