2012-12-31 6 views
5

extract(some_function_that_returns_array());Dlaczego funkcja extract() działa z funkcjami?

działa dobrze.

Ale na php.net mówi, że pierwszy parametr musi być zmienną referencyjną: http://php.net/manual/en/function.extract.php. Czy to błąd?


tak

function foo(&$array){} 

function lol(){ $arr = array(); return $arr; } 

foo(lol()); 

pokazuje "Strict Standards: Tylko zmienne powinny być przekazywane przez odniesienie w ..."

że nie wydarzy z ekstraktem

+0

Prosimy o rozważenie tego błędu i zgłoś go. Powiązanym błędem może być: https://bugs.php.net/bug.php?id=55222 Powiązane pytanie może być: http://stackoverflow.com/q/6726589/367456 – hakre

+0

cóż, tak naprawdę nie obchodzi mnie to o tym, ale pokazuje, że instrukcji nie można ufać: P co jeśli 'umrzeć()' zabije nas zamiast skryptu? :( – thelolcat

+0

lolcatly, nie przejmuj się, nie możesz zawsze zaufać dokumentom. Niezależnie od tego, co znaczy zaufanie, bzdury, myślę, że ta mała wada cię nie zabija, prawda? A jeśli cię to nie obchodzi, to proszę nie pytaj – hakre

Odpowiedz

1

czy dokumentacja jest w błędzie lub funkcja jest w błędzie. Szczerze mówiąc, nie mogę z jakiegoś powodu zobaczyć, dlaczego należy wyciągnąć tablicę przez odniesienie, ale ktoś wskazał flagę typu wyciągu EXTR_REFS.

Patrząc na moją lokalną wersję kodu PHP (5.3.2), widzę, że definicja funkcji dla extract() nie wskazuje przejścia przez odniesienie.

function extract (array $var_array, $extract_type = null, $prefix = null) 

Patrząc na sort() definicji ma pokazać przepustkę przez odniesienie:

function sort (array &$array, $sort_flags = null) 

To dlaczego nie dostać ścisłego błąd na extract() i widzę go na sort().

Zakładam, że dokumentacja na stronie php.net jest nieaktualna lub po prostu niepoprawna. extract() to stary szczeniak ... Nie jestem pewien, czy wracając w dniu definicja funkcji faktycznie wskazała &$var_array czy nie.

Inną opcją jest definicja funkcji, która została pomieszona w pewnym momencie, a dokumentacja poprawnie wskazuje, w jaki sposób powinna być, na podstawie tego, że istnieje flaga EXTR_REFS dodatkowego typu, co może mieć miejsce (stała ta nadal istnieje).

+1

To jest nieprawidłowe. Tylko dlatego, że przekazywanie odwołań w czasie połączenia zostało wycofane w wersji 5.3 i usunięte w wersji 5.4, nie oznacza, że ​​nie można już przekazywać zmiennych przez odwołanie. Całkowicie niezwiązane z pytaniem PO. – igorw

+0

@ Sterownik to jest poprawne. Przejście przez odniesienie osiąga się przez zdefiniowanie funkcji, nieokreślonej podczas wywoływania funkcji. – Ray

+1

Ta odpowiedź nie ma nic wspólnego z pytaniem. OP w ogóle nie pyta o czas połączenia. – webbiedave