PHP и ссылки несколько не интуитивно понятны. При правильном использовании ссылки в нужных местах могут обеспечить значительное повышение производительности или избежать очень уродливых обходных путей и необычного кода.
Следующее приведет к ошибке:
function f(&$v){$v = true;}
f(&$v);
function f($v){$v = true;}
f(&$v);
Ни один из них не должен потерпеть неудачу, поскольку они могли следовать приведенным ниже правилам, но, без сомнения, были удалены или отключены, чтобы избежать путаницы в наследство.
Если они действительно работали, оба включали избыточное преобразование в ссылку, а второе также включало избыточное преобразование обратно в переменную, содержащуюся в области.
Второе раньше было возможно, позволяя передавать ссылку на код, который не предназначен для работы со ссылками. Это крайне уродливо для ремонтопригодности.
Это ничего не будет делать:
function f($v){$v = true;}
$r = &$v;
f($r);
Более конкретно, он превращает ссылку обратно в обычную переменную, поскольку вы не запрашивали ссылку.
Это будет работать:
function f(&$v){$v = true;}
f($v);
Это означает, что вы передаете не-ссылку, но хотите ссылку, поэтому превращает ее в ссылку.
Это означает, что вы не можете передать ссылку на функцию, для которой ссылка явно не запрашивается, чтобы сделать ее одной из немногих областей, где PHP строг в отношении передачи типов или, в данном случае, в большей степени мета-типа.
Если вам нужно более динамичное поведение, это будет работать:
function f(&$v){$v = true;}
$v = array(false,false,false);
$r = &$v[1];
f($r);
Здесь он видит, что вы хотите ссылку и уже есть ссылка, поэтому оставляет его в покое. Это может также связать ссылку, но я сомневаюсь в этом.