ID:               32841
 Updated by:       [EMAIL PROTECTED]
 Reported By:      wagner at bonn dot edu
-Status:           Assigned
+Status:           Wont fix
 Bug Type:         Scripting Engine problem
 Operating System: *
 PHP Version:      4.3.11, 5.0.4
 Assigned To:      andi
 New Comment:

What you are trying to do is feasable in  different ways. - just not
the way you are trying.. (try the support channels for suggestions.) 
- whether what you are trying to do is a good idea (maintance, code
readability, creating bugs....) is another question...

changing the engine behavior to do what you say is extremely complex.
And the return on fixing this would not be worth the instability that
it would involve (we know from previous efforts at looking at this).

hint: use
return &$this->var; 
$tmp = &$foo->f_default();
incr($tmp);




Previous Comments:
------------------------------------------------------------------------

[2005-04-28 06:34:50] wagner at bonn dot edu

> In your case f_default() returns *copy*, not a reference   
No it doesn't.   
   
Try this as case 1 in the reproduce code as above: 
-------------------------------------------------- 
 case 1:   
   //forced reference works AND makes default behaviour 
   //work afterwards   
   echo incr($foo->f_ref())."\n";   
   echo incr($foo->f_default())."\n";   
   echo incr($foo->f_default())."\n";   
   break;   
   
Expected result:  
----------------  
1  
2  
2  
f_default() should return a copy 
  
Actual result: 
-------------- 
1 
2 
3 
incr() gets a reference to $foo->v and modifies it 
 
Since I filed this behaviour as another bug here 
http://bugs.php.net/bug.php?id=32840 
could it please be looked at too and be unbogusified?

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

[2005-04-27 23:45:04] [EMAIL PROTECTED]

Short version: 
this is expected and the error message clearly says why:
only variables can be referenced and you cannot make a reference to an
expression result.
Long version:
In your case f_default() returns *copy*, not a reference as you wrongly
consider, while f_ref() returns reference and should work indeed.
But I'm a bit surprised to see that f_copy() works, as it should give
the same warning as with f_default().
Concerning the case 2, AFAIK it's because of some reference magic: when
you return $this->v as reference, it turns in refernce itself
(refcount++) and the following call to f_default() returns this
reference.
Though, it would be interesting to see what engine gurus say about it.

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

[2005-04-26 14:54:41] wagner at bonn dot edu

Description:
------------
When returning a member-variable directly as a reference   
parameter into a function, a fatal error occurs:   
Fatal error: Only variables can be passed by reference ...  
The reproduce code displays the bug (for $case=0) as well 
as two simple workarounds that IMHO show that the 
ZEND-Engine should be able to handle this with no need for 
any error. 
This seems to have been around for a while, at least PHP 
4.3.x  
Probably related to 
http://bugs.php.net/bug.php?id=32840 

Reproduce code:
---------------
$case = 0;

function incr(&$int) {
  return $int++;
}

class foo {
  var $v = 1;
  function &f_ref() { return $this->v; }
  function f_copy() { return (int)$this->v; } //forced copy through
type-cast
  function f_default() { return $this->v; }
}

$foo =& new foo();
switch($case) {
 case 0:
  //default behaviour is broken
  echo incr($foo->f_default())."\n";
 case 1:
   //forced reference works AND makes default behaviour work
afterwards
   echo incr($foo->f_ref())."\n";
   echo incr($foo->f_default())."\n";
   break;
 case 2:
   //forced copy works
   echo incr($foo->f_copy())."\n";
   break;
}

Expected result:
----------------
incr() should get a copy of $foo->v 

Actual result:
--------------
Fatal error: Only variables can be passed by reference in 
foo.php on line 19 
 


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


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

Reply via email to