2012-12-31 19 views
5

extract(some_function_that_returns_array());Warum funktioniert extract() mit Funktionen?

funktioniert gut.

Aber auf php.net heißt es, dass der erste Parameter eine referenzierte Variable sein muss: http://php.net/manual/en/function.extract.php. Ist das ein Fehler?


so

function foo(&$array){} 

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

foo(lol()); 

zeigt:

"strenge Standards Nur Variablen sollten in ... Referenz übergeben werden", die nicht mit dem Extrakt geschieht

+0

Bitte beachten Sie dies einen Fehler und melden Sie es. Ein verwandter Bug könnte sein: https://bugs.php.net/bug.php?id=55222 Eine verwandte Frage könnte sein: http://Stackoverflow.com/q/6726589/367456 – hakre

+0

nun, das ist mir egal darüber, aber es zeigt, dass das Handbuch kann nicht vertraut werden: P was, wenn 'sterben()' tötet uns anstelle des Skripts? :( – thelolcat

+0

lolcatly, nimm es leicht. Du kannst den Docs nicht immer trauen. Was auch immer Vertrauen hier bedeutet, ich denke, dieser kleine Fehler bringt dich nicht um, richtig? Und wenn es dir egal ist, bitte frag nicht – hakre

Antwort

1

Entweder ist die Dokumentation fehlerhaft oder die Funktion ist fehlerhaft. Ehrlich gesagt, kann ich aus irgendeinem Grund nicht sehen, warum das Extrahieren ein Array als Referenz übergeben werden muss, aber jemand hat auf das EXTR_REFS-Flag für den Extract-Typ hingewiesen.

Wenn ich meine lokale Version des PHP-Codes (5.3.2) ansehe, kann ich sehen, dass die Funktionsdefinition für extract() nicht auf Referenz verweist.

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

bei sort() Mit Blick auf die Definition tut Show Pass von Referenz:

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

diesem Grund habe ich auf extract() nicht den strengen Fehler bekommen, und ich sehe es auf sort().

Ich nehme an, die Dokumentation auf php.net ist veraltet oder einfach nur falsch. extract() ist ein alter Welpe ... Ich bin mir nicht sicher, ob zurück an dem Tag die Funktionsdefinition tatsächlich angezeigt &$var_array oder nicht. Die andere Möglichkeit ist, dass die Funktionsdefinition irgendwann durcheinander geraten ist und die Dokumentation korrekt anzeigt, wie es sein sollte. Aufgrund der Tatsache, dass EXTR_REFS ein extra Typ Flag hat, kann dies der Fall sein (Diese Konstante existiert noch).

+1

Das ist falsch. Nur weil Call-Time-Pass-by-Reference in 5.3 veraltet und in 5.4 entfernt wurde, bedeutet das nicht, dass Sie vars nicht mehr per Referenz übergeben können. Völlig unabhängig von der Frage von OP. – igorw

+0

@igorw das ist richtig. Die Übergabe als Referenz erfolgt durch die Definition der Funktion, die beim Aufruf der Funktion nicht angegeben wird. – Ray

+1

Diese Antwort hat nichts mit der Frage zu tun. OP fragt überhaupt nicht nach Gesprächszeit. – webbiedave