PHP i referencje są nieco nieintuicyjne. Odpowiednio użyte odnośniki w odpowiednich miejscach mogą zapewnić dużą poprawę wydajności lub uniknąć bardzo brzydkich obejść i nietypowego kodu.
Następujące spowoduje błąd:
function f(&$v){$v = true;}
f(&$v);
function f($v){$v = true;}
f(&$v);
Żadne z nich nie musi zawieść, ponieważ mogą one przestrzegać poniższych zasad, ale bez wątpienia zostały usunięte lub wyłączone, aby zapobiec wielu nieporozumieniom.
Jeśli zadziałały, oba obejmują redundantną konwersję do referencji, a druga obejmuje również redundantną konwersję z powrotem do zmiennej o ograniczonym zasięgu.
Drugi umożliwiał przekazanie referencji do kodu, który nie był przeznaczony do pracy z referencjami. Jest to wyjątkowo brzydkie ze względu na łatwość konserwacji.
To nic nie da:
function f($v){$v = true;}
$r = &$v;
f($r);
Mówiąc dokładniej, zamienia referencję z powrotem w normalną zmienną, ponieważ nie poprosiłeś o referencję.
To zadziała:
function f(&$v){$v = true;}
f($v);
Widzisz, że przekazujesz nie-referencję, ale chcesz referencji, więc zamienia ją w referencję.
Oznacza to, że nie można przekazać referencji do funkcji, w której referencja nie jest wyraźnie proszona o uczynienie z niej jednego z niewielu obszarów, w których PHP ściśle przekazuje typy lub w tym przypadku bardziej typu meta.
Jeśli potrzebujesz bardziej dynamicznego zachowania, zadziała to:
function f(&$v){$v = true;}
$v = array(false,false,false);
$r = &$v[1];
f($r);
Tutaj widzisz, że chcesz referencję i już ją masz, więc zostaw ją w spokoju. Może również łańcuch odniesienia, ale wątpię w to.