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);
Тут видно, що ви хочете посилання і вже маєте посилання, тому залишає його в спокої. Він також може посилатися на посилання, але я сумніваюся в цьому.