На самом деле этот код написан для совместимости с PHP 4. Амперсанд бесполезен в PHP 5 (как сказал Тим - начиная с PHP 5, все объекты передаются по ссылке).
В PHP 4 все переменные были переданы по значению.
Если вы хотели передать его по ссылке, вы должны были объявить присвоение ссылки:
$ref_on_my_object =& new MyObject();
Этот код все еще принимается с конфигурацией по умолчанию PHP 5, но лучше написать:
$ref_on_my_object = new MyObject(); // Reference assignment is implicit
Что касается вашей второй проблемы, проблема почти такая же ...
Потому что PHP позволяет вам объявлять аргументы функций (соответственно, типы), а вы не можете сделать это для возвращаемых значений.
Принятая, но "не очень хорошая" практика - избегать ссылочного объявления в объявлении функции:
function foo($my_arg) {
// Some processing
}
и позвонить со ссылкой ...
$my_var;
$result = foo( &$my_var );
// $my_var may have changed because you sent the reference to the function
Идеальная декларация будет больше похожа на:
function foo( & $my_input_arg ) {
// Some processing
}
тогда вызов теряет амперсанд:
$my_var;
$result = foo( $my_var );
// $my_var may have changed because you sent the reference to the function