From:             benjiro at benjiro dot com
Operating system: Linux Debian Lenny
PHP version:      5.2.6
PHP Bug Type:     Class/Object related
Bug description:  __call and __set priority

Description:
------------
Unless my definition off the magic methods __call, and __set are wrong,
there seems to be a conflict between both.

When both __set & __call are defined, the __set method overrides __call,
even when the object in question is a clearly defined method.

Line1: $object->xxx( 'yyy', 'ooo' ); // At this point, __set will dominate
any call, while its clearly a method.
Line2: $object->xxx = zzz;

One expects that a method call can be recognized with (), yet, __set has a
higher priority, and thinks you are calling $object->xxx on line 1,
breaking the correct resolving to find out that its really a methode.

Reproduce code:
---------------
<?

$object = new test();
  // Create john with lastname, smith, and say hello. Note: we are not
doing anything with smith in this example.
$object->john( 'smith' )->hello(); 
  // Lets set a changed value to the changed list of object.
$object->john = xxx;

class test {
  private $changed = array();

  function __call ( $name, $args ) {
    $this->{$name} = new child();
    return $this->{$name};
  }

  function __get ( $name ) {
    if ( isset( $this->{$name} ) )
      return $this->{$name};
  }

  function __set ( $name, $value ) {
    echo 'Lets register a possible changed value';
    if ( isset( $this->{$name} ) )
      $this->changed[$name] = $value;
  }
}

class child {
  function hello () {
    echo 'Hello, im tests son, called john';
  }
}

?>

Expected result:
----------------
Expected:

Hello, im tests son, called john
Lets register a possible changed value



Actual result:
--------------
Actual result is:

Lets register a possible changed value
Fatal error: Call to a member function hello() on a non-object in
/xxx/index5.php on line 5

Line 5 is in reality the method...



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

Reply via email to