ID:               33884
 User updated by:  php-bug-33884 at ryandesign dot com
 Reported By:      php-bug-33884 at ryandesign dot com
-Status:           Bogus
+Status:           Open
 Bug Type:         Unknown/Other Function
 Operating System: N/A
 PHP Version:      4.4.0
 New Comment:

I wasn't sure if I was supposed to re-open the bug for you to 
see my new comments.


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

[2005-07-27 17:04:52] php-bug-33884 at ryandesign dot com

Thank you for your response.

I already checked the documentation on functions returning 
by reference and could not find any indication that such 
functions must always return something. If this is the case, 
then this should be documented. If it already is documented, 
I would appreciate a direct link to the relevant page.

I have many years of experience in software development, 
software testing and bug reporting, and did not think my bug 
report had been filed improperly. If you have specific 
suggestions for how I could make future bug reports more 
useful to you, by all means please share them with me.

Truly, if my function never returned anything, then as you 
say I would not need to declare the it as return-by-
reference. However, I do sometimes need to return a 
reference. Therefore the function must be declared in this 
way. Here is a more concrete example of what my function 
does:

class foo {
        function &get_or_set($bar, $baz = null) {
                if ($baz) {
                        $GLOBALS['qux'][$bar] =& $baz;
                } else {
                        return $GLOBALS['qux'][$bar];
                }
        }
}

In this particular case, I can avoid the error by modifying 
the code so that the "else" part occurs unconditionally. I 
just couldn't see any reason to require that a return-by-
reference function must return a value, when return-by-copy 
functions are not restricted in this manner. If such a 
reason exists, please enlighten me.

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

[2005-07-27 16:14:27] [EMAIL PROTECTED]

Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php

If you don\'t return anything you don\'t need 
return-by-reference... 

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

[2005-07-27 15:02:41] php-bug-33884 at ryandesign dot com

Description:
------------
Hi. After upgrading from PHP 4.3.11 to 4.4.0 I get the 
famous "Only variable references should be returned by 
reference" notice in one of my projects. The function in 
question returns by reference, but only needs to do this 
sometimes. Other times, it returns nothing at all, because 
the caller does not need a return value. In these latter 
cases, PHP produces the notice as of 4.4.0.

This surprised me because it's perfectly fine to have a 
normal return-by-copy function that does not return 
anything. So why not a return-by-reference function?

I couldn't find any documentation that if your function 
returns by reference, then you must always return something.

In my particular case I can rewrite the function so that it 
always returns something, even when the caller has no use 
for it. I just wasn't sure if the notice in this case was 
intended, and if so, why.

If the behavior is intended, then the documentation should 
reflect this.

Reproduce code:
---------------
error_reporting(E_ALL);

function &foo_by_reference_with_return() {
        echo __FUNCTION__ . "<br />\n";
        return $GLOBALS['bar'];
}
function &foo_by_reference_without_return() {
        echo __FUNCTION__ . "<br />\n";
} // line 11
function foo_by_copy_with_return() {
        echo __FUNCTION__ . "<br />\n";
        return $GLOBALS['bar'];
}
function foo_by_copy_without_return() {
        echo __FUNCTION__ . "<br />\n";
}

foo_by_reference_with_return();
foo_by_reference_without_return(); // causes notice in 4.4.0
foo_by_copy_with_return();
foo_by_copy_without_return();

Expected result:
----------------
foo_by_reference_with_return
foo_by_reference_without_return
foo_by_copy_with_return
foo_by_copy_without_return

Actual result:
--------------
foo_by_reference_with_return
foo_by_reference_without_return
Notice: Only variable references should be returned by 
reference in references.php on line 11
foo_by_copy_with_return
foo_by_copy_without_return


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


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

Reply via email to