Hmm, techniquement parlant, une référence est un pointeur, ça ne change rien. C'est juste un nom et une notation différente. D'ailleurs, je préfère mille fois les pointeurs aux références, tellement plus simple à gérer.
Donc PHP n'utilise pas des références partout, seulement pour les objets.
Pour les fonctions, écrire
$var = f($var);
n'est pas strictement équiavalent à
f(&$var);
(D'ailleurs, on n'écrit plus
f(&$var); mais
function f ( &$arg ) { ... } f($var); c'est plus correct). En fait, dans le premier cas, il attend le résultat avant décraser la valeur de la variable, alors que dans le second, le traitement est direct. Pas besoin de passer par une variable intermédiaire (cette valeur est en fait une copie de la première).
C'est pour ça qu'on parle de passage par adresse ou par copie de valeur. Soit on donne l'adresse (l'emplacement en mémoire) de la donnée, soit on donne la donnée elle-même. Dans le premier cas, on travaille toujours sur le même espace mémoire, alors que dans le second, on copie, donc on duplique, puis on travaille sur la copie. Dans le cas d'objet lourd, on comprend que c'est trop lent. Pareil pour d'énorme chaînes de caractères.
Pour ton exemple de file_get_contents(), si le fichier est trop lourd, le résultat le sera d'autant en mémoire, donc une erreur sera levée disant que la mémoire est pleine. On ne sait pas faire le lien entre un fichier et programme sans copier les données du fichier en mémoire (ou sinon, c'est extrêmement lent).
Est-ce que j'ai répondu à la question (car je n'en suis pas sûr

) ?
Une petite note intéressante (exercice 1, a

), voici plusieurs notations qui sont toutes différentes :
function f ( $arg ) { ... }
function g ( &$arg ) { ... }
function &h ( $arg ) { ... }
Elles ont toutes des comportements différents et sont utiles dans des cas différents. La première est normale : entrée et sortie (paramètre et retour) sont copiées. La deuxième : entrée pointée et sortie copiée. La dernière : entrée copiée et sortie pointée.
Je comprends en fait ta philosophie de style de codage. C'est vrai que c'est un aspect. Soit on retourne les valeurs, soit on passe une variable en référence qui va recevoir le résultat. On trouve souvent ça en C. Mais c'est un cas particulier (si j'ose dire) des références. C'est une application possible, mais la philosophie qui est derrière est plus balèze en fait. Est-ce que tu comprends ('suis fatigué là ...) ?