Nur Variablen sollten als Referenz übergeben werden

Lesezeit: 6 Minuten

Nur Variablen sollten als Referenz ubergeben werden
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'
);

Irgendwelche Ideen? Nach 2 Tagen immer noch fest.

1646947447 974 Nur Variablen sollten als Referenz ubergeben werden
Oswald

Weisen Sie das Ergebnis von zu explode in eine Variable und übergeben Sie diese Variable an end:

$tmp = explode('.', $file_name);
$file_extension = end($tmp);

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

    – NaturalBornCamper

    11. November 2017 um 15:41 Uhr

  • Jeden Tag hasse ich PHP ein bisschen mehr… 🙁

    – MarcoS

    28. Juli 2021 um 14:30 Uhr

Nur Variablen sollten als Referenz ubergeben werden
Sinan Eldem

Php 7-kompatible ordnungsgemäße Verwendung:

$fileName="long.file.name.jpg";
$tmp           = explode('.', $fileName);
$fileExtension = end($tmp);

echo $fileExtension;
// jpg

  • 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 🙂

    – Von einem Grue gefressen

    4. August 2015 um 23:37 Uhr

  • In php7 wird weiterhin eine Warnung ausgegeben. php.net/manual/en/…

    – kosten

    30. September 2016 um 8:28 Uhr


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

1646947448 320 Nur Variablen sollten als Referenz ubergeben werden
Floern

Speichern Sie das Array von explode() in einer Variablen und rufen Sie dann end() für diese Variable auf:

$tmp = explode('.', $file_name);
$file_extension = end($tmp);

Übrigens: Ich verwende diesen Code, um die Dateierweiterung zu erhalten:

$ext = substr( strrchr($file_name, '.'), 1);

wo strrchr extrahiert die Zeichenfolge nach der letzten . und substr schneidet die ab .

1646947449 936 Nur Variablen sollten als Referenz ubergeben werden
Will Vousden

Versuche dies:

$parts = explode('.', $file_name);
$file_extension = end($parts);

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().

https://www.php.net/manual/en/function.array-key-last.php

                 uuuuuuu
             uu$$$$$$$$$$$uu
          uu$$$$$$$$$$$$$$$$$uu
         u$$$$$$$$$$$$$$$$$$$$$u
        u$$$$$$$$$$$$$$$$$$$$$$$u
       u$$$$$$$$$$$$$$$$$$$$$$$$$u
       u$$$$$$$$$$$$$$$$$$$$$$$$$u
       u$$$$$$"   "$$$"   "$$$$$$u
       "$$$$"      u$u       $$$$"
        $$$u       u$u       u$$$
        $$$u      u$$$u      u$$$
         "$$$$uu$$$   $$$uu$$$$"
          "$$$$$$$"   "$$$$$$$"
            u$$$$$$$u$$$$$$$u
             u$"$"$"$"$"$"$u
  uuu        $$u$ $ $ $ $u$$       uuu
 u$$$$        $$$$$u$u$u$$$       u$$$$
  $$$$$uu      "$$$$$$$$$"     uu$$$$$$
u$$$$$$$$$$$uu    """""    uuuu$$$$$$$$$$
$$$$"""$$$$$$$$$$uuu   uu$$$$$$$$$"""$$$"
 """      ""$$$$$$$$$$$uu ""$"""
           uuuu ""$$$$$$$$$$uuu
  u$$$uuu$$$$$$$$$uu ""$$$$$$$$$$$uuu$$$
  $$$$$$$$$$""""           ""$$$$$$$$$$$"
   "$$$$$"                      ""$$$$""
     $$$"                         $$$$"

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

989030cookie-checkNur Variablen sollten als Referenz übergeben werden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy