Passing by reference is useful when you want to give a method (OOP) an object, for example, and manipulate it as it sees fit - and its going to be manipulating the object directly, not a copy of the object, as you would get if you passed it without reference.
For example:
Example 1:
function AppendString($input)
{
$input .= ' 123';
return $input;
}
$string = "test";
$result = AppendString($test);
echo $result;
($result is now: 'test 123').
Now, lets do the same again, except pass the $string variable by reference, and ask for the value to be returned by reference as well.
Example 2:
function &AppendString($input)
{
$input .= ' 123';
return $input;
}
$string = "test";
AppendString(&$string);
echo $string;
($string is now: 'test 123').
See how the second method, we pass &$string to AppendString? This means, 'heres the position in memory to the variable $string'. The function gets it and modifies it - Its now modified the $string value right in the procedure! Without passing by reference, we were just modifying a copy of the variable.
Notice we dont need to do (in the second example):
$test = AppendString(&$test);
Because the function directly modifies it, theres no need to use the return value (if any), as the variable was modified directly.
This wont be of much use in small development projects, but in large scale projects or those which make extensive use of objects find this functionality very useful.
http://au2.php.net/oop should be of help.