Edit report at http://bugs.php.net/bug.php?id=47623&edit=1
ID: 47623
Comment by: laruence at yahoo dot com dot cn
Reported by: Henry at huis-stijl dot nl
Summary: array_shift() fails with @ operator
Status: Verified
Type: Bug
Package: Scripting Engine problem
Operating System: *
PHP Version: 5.*, 6CVS (2009-04-30)
New Comment:
errata:
//then in zend_do_pass_param:
ZEND_SEND_VAR gen opcode:"SEND_REF", ZEND_SEND_VAL gen
opcode:"SEND_VAR_NO_REF"
Previous Comments:
------------------------------------------------------------------------
[2010-05-28 16:35:20] laruence at yahoo dot com dot cn
Hi, I found the same bug in php 5.2.8(linux)
and I also find out why:
in php complie phase,
@$var -> expr_without_variable;
//code
expr_without_variable:
...
| '@' { zend_do_begin_silence(&$1 TSRMLS_CC); }
expr { zend_do_end_silence(&$1 TSRMLS_CC); $$ = $3; }
while:
$var -> variable
then this different cause the znode's difference
//
non_empty_function_call_parameter_list:
expr_without_variable { Z_LVAL($$.u.constant) = 1;
zend_do_pass_param(&$1, ZEND_SEND_VAL, Z_LVAL($$.u.constant) TSRMLS_CC);
}
| variable { Z_LVAL($$.u.constant) = 1;
zend_do_pass_param(&$1, ZEND_SEND_VAR, Z_LVAL($$.u.constant) TSRMLS_CC);
}
then in zend_so_pass_param:
ZEND_SEND_VAR gen opcode:"SEND_REF", ZEND_SEND_VAR gen
opcode:"SEND_VAR_NO_REF"
so when use @, cause param send without ref.
you can find more info on : http://www.laruence.com/2010/05/28/1565.html
------------------------------------------------------------------------
[2010-05-05 20:56:31] whatrevolution at yahoo dot com
<?php
$_SESSION['villas'] = array
(
1 => array(1,2,3),
2 => array(2,3,4),
3 => array(3,4,5),
4 => array(4,5,6),
);
/*
* ONE:
*/
/*
While(@$_SESSION['villas'] != array())
{
$row = array_shift(@$_SESSION['villas']);
print_r($row);
}// einde while
*/
/*
* TWO:
*/
/*
while($foo['villas'] != array())
{
$row = array_shift(@$foo['villas']); // Removing @ makes it work..
var_dump($foo);
}
*/
/*
* THREE:
*/
//I cann bypass this failure by using:
$arr_temp = @$_SESSION['villas'];
$row = array_shift($arr_temp);
$_SESSION['villas'] = $arr_temp;
unset($arr_temp);
var_dump($_SESSION['villas']);
?>
Result:
One and Two, same as described before.
Three:
array
0 =>
array
0 => int 2
1 => int 3
2 => int 4
1 =>
array
0 => int 3
1 => int 4
2 => int 5
2 =>
array
0 => int 4
1 => int 5
2 => int 6
PHP Version 5.2.10-2ubuntu6.4
System Linux 2.6.31-20-generic x86_64
Build Date Jan 6 2010 22:36:47
Server API Apache 2.0 Handler
PHP API 20041225
PHP Extension 20060613
Zend Extension 220060519
Debug Build no
Thread Safety disabled
Zend Memory Manager enabled
Apache/2.2.12 (Ubuntu)
------------------------------------------------------------------------
[2009-04-13 18:23:01] [email protected]
This has nothing to do with sessions. Simplified script:
<?php
$foo['villas'] = array('a','b','c');
while($foo['villas'] != array())
{
$row = array_shift(@$foo['villas']); // Removing @ makes it work..
var_dump($foo);
}
?>
------------------------------------------------------------------------
[2009-03-16 22:11:28] Henry at huis-stijl dot nl
Tried with and without the @ same output.
------------------------------------------------------------------------
[2009-03-16 16:26:07] [email protected]
If you remove those @'s, what does it output..?
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
http://bugs.php.net/bug.php?id=47623
--
Edit this bug report at http://bugs.php.net/bug.php?id=47623&edit=1