From:             
Operating system: Windows 7
PHP version:      5.4.2
Package:          Dynamic loading
Bug Type:         Bug
Bug description:array returned from __get method gices a notice when trying to 
change a value

Description:
------------
I'm using the latest downloadable version of PHP 5.4.2.

See the following code (this code works):
-----------

<?php

class A {
  private $vars;

  public function __get($name) {
    if (!isset($this->vars[$name])) {
      $arrObj = new B();
      $this->vars[$name] = $arrObj;
    }

    $obj = $this->vars[$name];    
    return $obj;    
  }

  
}

class B {
  public $rolename = 'foo';
}


$a = new A;
var_dump($a);
echo $a->role->rolename.PHP_EOL;
$a->role->rolename = 'test';

echo $a->role->rolename;

?>

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

What happends in this code is that i create a simple object "A". From that
object i try to get the 'role' property. It doesn't exist, so the magic
__get() function is called.

In there i create a B() object and i return the instance of that object.
Right after that i'm trying to access the 'rolename' property of the 'B()'
object:

echo $a->role->rolename.PHP_EOL;
$a->role->rolename = 'test';

This works. It successfully echo's the rolename and changes it after that.

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

The problem occurs when i return an array with objects:

<?php

class A {
  private $vars;

  public function __get($name) {
    if (!isset($this->vars[$name])) {
      $arrObj = array();
      $arrObj[] = new B();
      $arrObj[] = new B();
      $this->vars[$name] = $arrObj;
    }

    return $this->vars[$name];
  }

  
}

class B {
  public $rolename = 'foo';
}


$a = new A;
var_dump($a);
echo $a->role[0]->rolename.PHP_EOL;
$a->role[0]->rolename = 'test';

echo $a->role[0]->rolename;
?>

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

This code gives me the following notice:

"Notice: Indirect modification of overloaded property A::$role has no
effect"

Strangely enough it tells me that i can't change the property any more. Or
better yet, it has no effect. The only difference is, is that i get the
object from an array.

The weird thing is though, that it DOES alter the value of the property,
regardless of the notice.

I think the notice shouldn't be displayed in this case. 

Test script:
---------------
<?php

class A {
  private $vars;

  public function __get($name) {
    if (!isset($this->vars[$name])) {
      $arrObj = array();
      $arrObj[] = new B();
      $arrObj[] = new B();
      $this->vars[$name] = $arrObj;
    }

    return $this->vars[$name];
  }

  
}

class B {
  public $rolename = 'foo';
}


$a = new A;
var_dump($a);
echo $a->role[0]->rolename.PHP_EOL;
$a->role[0]->rolename = 'test';

echo $a->role[0]->rolename;
?>

Expected result:
----------------
I expected that $a->role[0]->rolename = 'test'; simply changed the value of
that property, but it generates an unexpected 'notice'.

But: echo $a->role[0]->rolename; does show me that the property was
actually changed, regardless of the notice which tells that it can't be
changed.


-- 
Edit bug report at https://bugs.php.net/bug.php?id=61945&edit=1
-- 
Try a snapshot (PHP 5.4):            
https://bugs.php.net/fix.php?id=61945&r=trysnapshot54
Try a snapshot (PHP 5.3):            
https://bugs.php.net/fix.php?id=61945&r=trysnapshot53
Try a snapshot (trunk):              
https://bugs.php.net/fix.php?id=61945&r=trysnapshottrunk
Fixed in SVN:                        
https://bugs.php.net/fix.php?id=61945&r=fixed
Fixed in SVN and need be documented: 
https://bugs.php.net/fix.php?id=61945&r=needdocs
Fixed in release:                    
https://bugs.php.net/fix.php?id=61945&r=alreadyfixed
Need backtrace:                      
https://bugs.php.net/fix.php?id=61945&r=needtrace
Need Reproduce Script:               
https://bugs.php.net/fix.php?id=61945&r=needscript
Try newer version:                   
https://bugs.php.net/fix.php?id=61945&r=oldversion
Not developer issue:                 
https://bugs.php.net/fix.php?id=61945&r=support
Expected behavior:                   
https://bugs.php.net/fix.php?id=61945&r=notwrong
Not enough info:                     
https://bugs.php.net/fix.php?id=61945&r=notenoughinfo
Submitted twice:                     
https://bugs.php.net/fix.php?id=61945&r=submittedtwice
register_globals:                    
https://bugs.php.net/fix.php?id=61945&r=globals
PHP 4 support discontinued:          
https://bugs.php.net/fix.php?id=61945&r=php4
Daylight Savings:                    https://bugs.php.net/fix.php?id=61945&r=dst
IIS Stability:                       
https://bugs.php.net/fix.php?id=61945&r=isapi
Install GNU Sed:                     
https://bugs.php.net/fix.php?id=61945&r=gnused
Floating point limitations:          
https://bugs.php.net/fix.php?id=61945&r=float
No Zend Extensions:                  
https://bugs.php.net/fix.php?id=61945&r=nozend
MySQL Configuration Error:           
https://bugs.php.net/fix.php?id=61945&r=mysqlcfg

Reply via email to