Все просто!) bar возвращает ссылку на $a а не само значение! А foo принимает ссылку а не значение и изменяет его! Тем самым $a в bar станет 6)
а вот возвращение по ссылке "ниасилил".
просто когда мы return $a мы возвращаем значение 5! А если мы перед названием функции пишем & то это значит что она возвратит ссылку на эту переменую с этим значением)
// возвращает значение которое хранится в $a
function bar()
{
$a = 5;
return $a;
}
// возвращает ссылку на $a , эту ссылку можно использовать в функциях ожидающих ссылку а не значение например foo()
function &bar()
{
$a = 5;
return $a;
}