Use of closure causes problem in ArrayAccess
| Bug #54367 | Use of closure causes problem in ArrayAccess | ||||
|---|---|---|---|---|---|
| Submitted: | 2011-03-24 13:52 UTC | Modified: | 2011-05-11 08:58 UTC | ||
| From: | jpauli@php.net | Assigned: | dmitry (profile) | ||
| Status: | Closed | Package: | Scripting Engine problem | ||
| PHP Version: | 5.3.6 | OS: | *nix | ||
| Private report: | No | CVE-ID: | None | ||
[2011-03-24 13:52 UTC] jpauli@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
Patches
Pull Requests
History
AllCommentsChangesGit/SVN commits
[2011-03-24 22:49 UTC] felipe@php.net
-Status: Open +Status: Assigned -Assigned To: +Assigned To: dmitry
[2011-03-24 22:49 UTC] felipe@php.net
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'}[2011-03-25 09:55 UTC] jpauli@php.net
[2011-04-20 15:00 UTC] dmitry@php.net
-Status: Assigned +Status: Closed
[2011-04-20 15:00 UTC] dmitry@php.net
[2011-05-10 18:36 UTC] tony2001@php.net
[2011-05-11 08:58 UTC] dmitry@php.net
-Status: Re-Opened +Status: Closed
[2011-05-11 08:58 UTC] dmitry@php.net