...
какой будет вывод? Т.е. есть ли разница между атомарными объектами, и объектами классов? Ну и, собственно, чем отличается объект от переменной(ссылки на объект) =)
Пример некорректный

В приведённом примере результаты будут одинаковы. В моей предыдущей ссылке есть хороший пример. Цитирую:
<?php
class Person {
var $name;
function getName() {
return $this->name;
}
function setName($name) {
$this->name = $name;
}
function Person($name) {
$this->setName($name);
}
}
function changeName($person, $name) {
$person->setName($name);
}
$person = new Person("Andi");
changeName($person, "Stig");
print $person->getName();
?>
В РНР4 этот код выведет "Andi". Причина кроется в том, что мы передаем объект $person в функцию changeName() по значению,
а не по ссылке, таким образом, объект $person будет скопирован, и changeName() будет работать уже с копией объекта $person.
Ну а уже в РНР5 объектную модель переписали, там вышеприведённый пример отработает так, как и ожидалось автором - присвоит свойству $name объекта $person значение "Stig".
Чтоб в РНР4 код работал так-же, там надо передавать в changeName объект по ссылке.
Пользователь решил продолжить мысль 04 Июня 2010, 02:38:12:
Вся проблема в том, что это стиль программиста. И неизвестно где и когда встретятся еще такие моменты, т.к. ошибки там, по сути, нету в определении. Ошибка в вызове. К примеру, есть функция test. Определена она как
function test(&$string){echo $string;}
ошибки тут нету. Она вполне работоспособна и, даже, программист как бы позаботился о выделении памяти под псевдобольшие объекты. Однако, если дальше в коде мы вызовем эту функцию как
test("My Little String");
то в версии 5.2 все будет замечательно, а версия 5.3 выскочит с фатальной ошибкой. Тут php сам себя загнал в тупик. А найти все потенциальноопасные места в коде без тестирования всей системы очень проблематично. По этому тут зависит от размера проекта. Возможно откатиться на 5.2 все-таки будет проще, чем найти все опасные места в коде.
Кстати.. Тут как раз всё верно

Использование указателей давно объявлено было в РНР как deprecated. В вашем примере вы объявили функцию, которая получает указатель на объект (строку) - и затем печатает её.
Но в вызове функции вы не создаёте никакого объекта-строки, вы просто вызываете функцию со строковой константой, которую нельзя изменить. Соотв. и получаем собщение об ошибке - "Fatal error: Only variables can be passed by reference"
Чтоб этот код отработал корректно - ему надо скормить переменную:
function test(&$string){echo $string;}
$str='My Little String';
test($str);
при этом в функцию test() будет передана ссылка на строку $str и при желании функция сможет внести в неё исправления.
function test(&$string) { // тут передана ссылка на глобальный объект
$string='Change';
}
$str='My Little String';
test($str);
echo $str;
выведет 'Change', но
function test($string) { // а в этом случае будет создана копия
$string='Change';
}
$str='My Little String';
test($str);
echo $str;
выведет 'My Little String'. Но есть универсальный способ, который будет работать на любой версии РНР без ошибок

function test($var) {
global $$var;
$$var='Change';
}
$str='My Little String';
test('str');
echo $str;
тут нет указателей, тут идёт явное объявление переменной как global - и соотв. функция получает к ней доступ напрямую, а не через копию.