Nur Variablen sollten als Referenz übergeben werden
Lesezeit: 6 Minuten
Frank Nwoko
// Other variables
$MAX_FILENAME_LENGTH = 260;
$file_name = $_FILES[$upload_name]['name'];
//echo "testing-".$file_name."<br>";
//$file_name = strtolower($file_name);
$file_extension = end(explode('.', $file_name)); //ERROR ON THIS LINE
$uploadErrors = array(
0=>'There is no error, the file uploaded with success',
1=>'The uploaded file exceeds the upload max filesize allowed.',
2=>'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form',
3=>'The uploaded file was only partially uploaded',
4=>'No file was uploaded',
6=>'Missing a temporary folder'
);
Das Problem ist, dass end erfordert eine Referenz, weil sie die interne Darstellung des Arrays modifiziert (d.h. sie macht die aktueller Elementzeiger zeigen Sie auf das letzte Element).
Das Ergebnis von explode('.', $file_name) kann nicht in eine Referenz umgewandelt werden. Dies ist eine Einschränkung in der PHP-Sprache, die wahrscheinlich aus Gründen der Einfachheit existiert.
@Oswald, wir können die Warnung mit ausschalten error_reporting. Ist dies sicher?
– Schrittmacher
9. Dezember 2014 um 11:48 Uhr
Ausschalten ist sicher error_reporting. Es ist nicht sicher, Fehler blind zu ignorieren. Ausschalten error_reporting ist ein großer Schritt in Richtung blindes Ignorieren von Fehlern. Deaktivieren Sie in der Produktionsumgebung display_errors stattdessen Fehler in eine Protokolldatei schreiben.
– Oswald
10. Dezember 2014 um 23:08 Uhr
Funktioniert nicht. Die Antwort unten – doppelte Klammern – funktioniert.
– bbe
29. Oktober 2016 um 14:38 Uhr
Wie kann man diese Hinweise jedoch ausschalten? Ich habe versucht, E_NOTICE zu ignorieren, aber sie werden immer noch angezeigt
Seltsam. Das geht aber wie? Unterdrückt es die Warnung, ähnlich wie die @ Präfix tut?
– Nigel Alderton
5. Februar 2014 um 15:31 Uhr
Warum entfernt das Hinzufügen einer zusätzlichen Klammer den Fehler?
– Nigel Alderton
18. März 2014 um 0:53 Uhr
Ich habe diese Eigenart recherchiert und es scheint eine zu sein Insekt? mit dem PHP-Parser wo doppelte Klammer „(())“ bewirkt, dass die Referenz in einen einfachen Wert umgewandelt wird. Mehr dazu Verknüpfung.
– Kallistino
1. April 2014 um 17:22 Uhr
Ich mag das .. aber ich mag es gleichzeitig nicht. Danke, dass du mir den Tag ruiniert hast 🙂
Alle anderen haben Ihnen bereits den Grund genannt, warum Sie einen Fehler erhalten, aber hier ist der beste Weg, das zu tun, was Sie tun möchten: $file_extension = pathinfo($file_name, PATHINFO_EXTENSION);
Ich stimme zu. Es hat keinen Sinn, Dateipfade per String-Manipulation zu parsen, wenn Sie über entsprechende APIs verfügen.
– gd1
7. Januar 2014 um 7:43 Uhr
Dies ist die beste Antwort für mich, die String-Manipulationen fügen dem Code nur wenig Chaos hinzu
– oussama benomnas
17. Januar um 13:05 Uhr
Floern
Speichern Sie das Array von explode() in einer Variablen und rufen Sie dann end() für diese Variable auf:
Der Grund ist, dass das Argument für end wird als Referenz übergeben, da end ändert das Array, indem es seinen internen Zeiger auf das letzte Element vorrückt. Wenn Sie keine Variable übergeben, gibt es nichts, worauf eine Referenz zeigen könnte.
Sehen end im PHP-Handbuch für weitere Informationen.
Da hisst es seit über 10 Jahren eine Flagge, funktioniert aber prima und bringt den erwarteten Wert ein wenig zurück stfu-Operator ist die beste schlechte Praxis, nach der Sie alle suchen:
$file_extension = @end(explode('.', $file_name));
Aber Achtung, wegen Leistungseinbußen nicht in Schleifen verwenden. Die neueste Version von PHP 7.3+ bietet die Methode array_key_last() und array_key_first().
PHP beschwert sich, weil end() erwartet einen Verweis auf etwas, das es ändern möchte (was nur eine Variable sein kann). Sie übergeben jedoch das Ergebnis von explode() direkt zu end() ohne es zuerst in einer Variablen zu speichern. Im Moment wann explode() gibt Ihren Wert zurück, er existiert nur im Speicher und keine Variable zeigt darauf. Sie können keinen Verweis auf etwas (oder auf etwas Unbekanntes im Speicher) erstellen, das nicht existiert.
Oder anders gesagt: PHP weiß nicht, ob der Wert, den Sie ihm geben, der direkte Wert ist oder nur ein Zeiger auf den Wert (ein Zeiger ist auch eine Variable (Integer), die den Offset des Speichers speichert, wo der eigentliche Wert steht wohnt). PHP erwartet hier also immer einen Zeiger (Referenz).
Aber da dies in PHP 7 immer noch nur eine Benachrichtigung ist (nicht einmal veraltet), können Sie Benachrichtigungen sicher ignorieren und den Ignorieren-Operator verwenden, anstatt die Fehlerberichterstattung für Benachrichtigungen vollständig zu deaktivieren:
$file_extension = @end(explode('.', $file_name));
@OskarCalvo Das ist auch meine Philosophie. Dies ist jedoch kein Fehler – PHP behandelt dies als “Hinweis”. Und es war eine alternative “Lösung” zu anderen Antworten hier, die niemand direkt erwähnt hat. Ein besserer Weg wäre, den Wert von zu speichern explode zu einer temporären Variablen, wie andere hier geschrieben haben. Aber noch einmal: Dies ist kein Fehler, daher ist es in Ordnung, diesen Operator zu verwenden. PHP ist im Allgemeinen schlecht bei der Fehlerbehandlung. Daher würde ich vorschlagen zu verwenden set_error_handler und set_exception_handler zur Fehlerbehandlung und als sauberste Lösung.
– Magier
4. Dezember 2016 um 12:57 Uhr
Es ist eine schreckliche Antwort. Ein Fehler könnte überall sein – zum Beispiel könnte $file_name für explode ungeeignet sein oder existiert nicht. Aber @ wird sie alle unterdrücken.
– Ihr gesunder Menschenverstand
25. August 2021 um 13:25 Uhr
Ich stimme dem nicht zu, da es auch eine gültige Antwort ist, aber es ist sicherlich ein sehr schlechter Rat. Sie können später verrückt werden, um zu debuggen, wenn dort etwas auftritt …
– Luciano Fantuzzi
26. Februar um 23:38 Uhr
9890300cookie-checkNur Variablen sollten als Referenz übergeben werdenyes
Eine bessere Erklärung für den Grund vijayasankarn.wordpress.com/2017/08/28/…
– Eine Ameise
20. September 2018 um 5:44 Uhr