Edit report at https://bugs.php.net/bug.php?id=55021&edit=1

 ID:                 55021
 User updated by:    dev at meta-gen dot com
 Reported by:        dev at meta-gen dot com
 Summary:            Multiple bug on variable variable error
                     parse/comportement
 Status:             Open
 Type:               Bug
 Package:            Scripting Engine problem
 Operating System:   Debian lenny/SID
 PHP Version:        5.3SVN-2011-06-09 (snap)
 Block user comment: N
 Private report:     N

 New Comment:

Hello,

Sorry perhaps i not good explain,

I found TWO bug.

The first is in function 'fn'
I try add a value in $this->a by variable variable
like this : 

class C
{
        public $a = array();

        public function fn()
        {
                $b = 'a';
                $this->$b['key'] = 'foo';
                return $this->a;
        }
}
$C = new C;
var_dump($C->fn());

This code return string(3) "foo". IS BAD RESULT

Normaly GOOD result for fn must be array(1) { ["key"]=> string(3) "foo" } 
because $this->$b == $this->a



AND second bug is in fn3
class C
{
        public $a = array();
        public function fn3()
        {
                $b = 'a';
                $this->$b['key'][] = 'foo'; ///BUG Error parse : PHP Fatal 
error:  Cannot use [] for reading in .... 
                return $this->a;
        }
}
$C = new C;
var_dump($C->fn3());

This code cause Error parse : PHP Fatal error:  Cannot use [] for reading in 
.... 
when it should return array(1) { ["key"]=> array(1) { [0]=> string(3) "foo" } }

because $this->$b['key'][] == $this->a['key'][]

Salutation.


Previous Comments:
------------------------------------------------------------------------
[2011-07-20 23:24:33] binarycleric at gmail dot com

I looked into this for a bit and I must say I was a bit confused until the 
answer smacked me in the face.

The 'fn3' method isn't doing what you think it's doing.  Upon glancing at the 
code it may appear that $this-
>a['first'] is having the value 'foo' appended to it (which doesn't make sense 
because $this->a['first'] is 
a string, not an array).

What is actually happening (according to my tests on PHP 5.2.17) is that $b[$k]
[] is being evaluated first 
and then the result is being used at the property name, which explains the 
"Cannot use [] for reading" 
error.

Assuming your test code was changed and $this->a['first'] was an array, the 
"slightly more correct" way 
would be to call $this->{$b}[$k][] which would evaluate to $this->a['first'][].

In my opinion this should be classified as "not a bug".

------------------------------------------------------------------------
[2011-06-10 02:07:09] dev at meta-gen dot com

Description:
------------
When use variable variable with property array in class, a multipe bug occur.

On function exemple fn, variable variable cast in string


On function exemple fn3, parse error 'Cannot use [] for reading in'

Test script:
---------------
class C
{
        public $a = array('first' => 'baz');

        /**
         * It's work but $this->a is cast in string and override array
         * @note $this->a : string(3) "foo" 
         */
        public function fn($k)
        {
                $b = 'a';
                $this->$b[$k] = 'foo';
        }

        /**
         * Normaly use
         * @note Similar result of fn
         * @note $this->a : string(3) "foo"
         */
        public function fn2($k)
        {
                $b = 'a';
                $this->$b = 'foo';
        }

        /**
         * This case is most interesting, because as it run parse error
         * @note don't parse $this->$b
         */
        public function fn3($k)
        {
                $b = 'a';
                $this->$b[$k][] = 'foo'; ///BUG Error parse : PHP Fatal error:  
Cannot use [] for reading in .... 
        }

        /**
         * Solution for fix fn3
         */
        public function fn4($k)
        {
                $b = 'a';
                $tmp =& $this->$b;
                $tmp[$k][] = 'foo';
        }
}


Expected result:
----------------
for function fn('key') : array('first' => 'baz', 'key' => 'foo')


for function fn3('key') :

array(2) {
  ["first"]=>
  string(3) "baz"
  ["key"]=>
  array(1) {
    [0]=>
    string(3) "foo"
  }
}



Actual result:
--------------
for function fn('key') : string(3) "foo"


for function fn3('key') : Cannot use [] for reading in...



------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=55021&edit=1

Reply via email to