With respect to passing and returning by reference, because of the internal reference counting mechanism the script will only actually create copies when modifications to items occur. E.g
// imagine we have a class Foo
$var1 = &new Foo();
$var1->name = 'Spanner';
$var2 = $var1; // there's still only one object Foo with a reference count of 2
$var2->name = 'Muppet'; // a copy is now made and updated
The same thing occurs when you pass data back from a function, the receiving variable really just increases the reference count to the data - but when the function goes out of scope the reference count to the item returned drops and is now just coming from the object it was assigned to ($item = func_data()) so in reality returning by reference isn't necessary for most functions, only functions that expressly deal with returning references for other purposes.
That all sounds a bit muddy as I read it back, but it's all in the manual somewhere.