PHP i odniesienia są nieco unintuitive. Jeśli użyjesz odpowiednich odnośników we właściwych miejscach, możesz uzyskać znaczną poprawę wydajności lub uniknąć bardzo brzydkich obejść i nietypowego kodu.
Poniższa będzie produkować błąd:
function f(&$v){$v = true;}
f(&$v);
function f($v){$v = true;}
f(&$v);
Żaden z nich się nie powiedzie, gdyż mogą one przestrzegać zasad poniżej, ale nie mają wątpliwości zostały usunięte lub wyłączone, aby zapobiec wielu starszych zamieszania.
Jeśli zadziałały, oba wymagają redundantnej konwersji do referencji, a druga wiąże się z nadmiarową konwersją z powrotem do zmiennej zawierającej zakres.
Drugi był możliwy, umożliwiając przekazanie odwołania 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 zrobi:
function f($v){$v = true;}
$r = &$v;
f($r);
Dokładniej, okazuje odesłanie z powrotem do normalnej zmiennej a nie prosić o odniesienie.
to będzie działać:
function f(&$v){$v = true;}
f($v);
ten widzi, że jesteś przechodzącą Niereferencyjne ale chcą odniesienie więc zamienia ją odniesienie.
Oznacza to, że nie można przekazać odwołania do funkcji, w której odwołanie nie jest jawnie wymagane, aby uczynić go jednym z niewielu obszarów, w których PHP jest ścisłe dla typów przekazywania lub w tym przypadku bardziej typu meta .
Jeśli potrzebujesz bardziej dynamiczne zachowanie to będzie działać:
function f(&$v){$v = true;}
$v = array(false,false,false);
$r = &$v[1];
f($r);
Tu widzi, że chcesz odniesienie i już odniesienie więc pozostawia w spokoju. Może również łączyć odniesienie, ale wątpię w to.
Powiązane: [Ostrzeżenie PHP: odwołanie do czasu połączenia zostało wycofane] (http://stackoverflow.com/q/4665782/2157640) – Palec