PHP: Was ist eine Alternative zu empty(), wo die Zeichenfolge “0” nicht als leer behandelt wird? [duplicate]

Lesezeit: 4 Minuten

Benutzer-Avatar
thomasrutter

Mögliches Duplikat:

Behebung der leeren PHP-Funktion

In PHP ist empty() eine großartige Abkürzung, da Sie damit überprüfen können, ob eine Variable gleichzeitig definiert UND nicht leer ist.

Was würden Sie verwenden, wenn Sie nicht möchten, dass „0“ (als Zeichenfolge) als leer betrachtet wird, Sie aber dennoch möchten, dass false, null, 0 und „“ als leer behandelt werden?

Das heißt, ich frage mich nur, ob Sie dafür eine eigene Verknüpfung haben:

if (isset($myvariable) && $myvariable != "") ;// do something
if (isset($othervar  ) && $othervar   != "") ;// do something
if (isset($anothervar) && $anothervar != "") ;// do something
// and so on, and so on

Ich glaube nicht, dass ich dafür eine Hilfsfunktion definieren kann, da die Variable undefiniert sein könnte (und daher nicht als Parameter übergeben werden könnte).

  • Ich denke, ich habe jetzt erkannt, dass es dafür keine Lösung gibt – zumindest keine, die diesen Code kürzer machen kann.

    – Thomas Rutter

    17. April 2009 um 15:03 Uhr

  • Lösung gefunden: if (($var ?? 0) != ''). Das $var ?? 0 ist eine Abkürzung für isset($var) ? $var : 0. Dann ist die != '' führt eine implizite Umwandlung in eine Zeichenfolge durch. Wenn der Wert null, falsch oder numerisch 0 ist, dann ist er falsch, aber wenn es die Zeichenfolge “0” ist, ist er wahr, da es keine Umwandlung gibt.

    – Thomas Rutter

    11. November 2020 um 0:58 Uhr


Benutzer-Avatar
Calvin

Dies sollte tun, was Sie wollen:

function notempty($var) {
    return ($var==="0"||$var);
}

Bearbeiten: Ich denke, Tabellen funktionieren nur in der Vorschau, nicht in tatsächlichen Antwortübermittlungen. Bitte beziehen Sie sich daher auf die Vergleichstabellen für PHP-Typen Für mehr Information.

notempty("")       : false
notempty(null)     : false
notempty(undefined): false
notempty(array())  : false
notempty(false)    : false
notempty(true)     : true
notempty(1)        : true
notempty(0)        : false
notempty(-1)       : true
notempty("1")      : true
notempty("0")      : true
notempty("php")    : true

Grundsätzlich ist notempty() dasselbe wie !empty() für alle Werte außer für “0”, für die es zurückgibt Stimmt.


Bearbeiten: Wenn Sie verwenden error_reporting(E_ALL), können Sie eine undefinierte Variable nicht per Wert an benutzerdefinierte Funktionen übergeben. Und wie Mercator betont, sollten Sie das tun stets verwenden E_ALL Best Practices entsprechen. Dieser Link (Kommentar Nr. 11) Er erläutert, warum Sie aus Gründen der Leistung und Wartbarkeit/Debugging keine Form der Fehlerunterdrückung verwenden sollten.

In der Antwort von orlandu63 erfahren Sie, wie Argumente an eine benutzerdefinierte Funktion übergeben werden per Referenz.

  • Das schlägt fehl, wenn die Variable nicht definiert ist.

    – Merkator

    9. April 2009 um 7:41 Uhr

  • Wie meinen Sie? Wenn eine undefinierte Variable übergeben wird, gibt die Funktion false zurück – was das Gegenteil von dem ist, was empty() zurückgibt: us2.php.net/manual/en/types.comparisons.php Das ist das gewünschte Verhalten.

    – Kalvin

    9. April 2009 um 9:57 Uhr

  • Es schlägt nicht fehl, sondern erzeugt eine Warnung. Also, obwohl es funktioniert, ist es nicht der richtige Weg ™. Sie sollten isset() verwenden, bevor Sie die Variable mit === überprüfen

    – Milan Babuškov

    9. April 2009 um 16:45 Uhr

  • Seltsam, es werden keine Warnungen ausgegeben, wenn ich die Fehlerberichterstattung auf E_STRICT eingestellt habe. Wenn ich jedoch E_ALL verwende, erzeugt es einen Fehler. Aber die Verwendung von isset() innerhalb der Funktion verhindert den Fehler auch nicht.

    – Kalvin

    9. April 2009 um 21:52 Uhr

  • E_STRICT ist keine Obermenge von E_ALL: php.net/manual/en/errorfunc.constants.php. Sie sollten (E_ALL | E_STRICT) verwenden. Du könnte Verwenden Sie den @-Operator, aber das fügt Overhead hinzu (siehe smashingmagazine.com/2009/03/24/10 “Tipp” Nr. 9 und Kommentar Nr. 11) und ist auch nicht The Right Way™.

    – Merkator

    10. April 2009 um 12:00 Uhr

function isempty(&$var) {
    return empty($var) || $var === '0';
}

Der Schlüssel ist die & Operator, der die Variable übergibt Hinweiserstellt es, wenn es nicht existiert.

  • Clever gedacht, würde dies nicht immer noch einen Fehler (oder eine Warnung oder einen Hinweis) ausgeben, wenn $var nicht existiert?

    – Thomas Rutter

    9. Mai 2011 um 0:24 Uhr

  • Tatsächlich bewirkt diese Funktion stillschweigend, dass eine undefinierte Variable definiert wird (als null), ohne einen Fehler oder eine Benachrichtigung irgendeiner Art auszugeben.

    – Brillant

    24. Juli 2013 um 18:10 Uhr

if(isset($var) && ($var === '0' || !empty($var)))
{
}

if ((isset($var) && $var === "0") || !empty($var))
{

}

Auf diese Weise geben Sie das if-Konstrukt ein, wenn die Variable gesetzt ist UND “0” ist, ODER die Variable gesetzt ist UND nicht = null (“0”,null,false)

Die Antwort darauf ist, dass es nicht möglich ist, das zu kürzen, was ich bereits habe.

Das Unterdrücken von Hinweisen oder Warnungen ist nichts, was ich tun möchte, daher muss ich immer prüfen, ob empty() oder isset() ist, bevor ich den Wert überprüfe, und Sie können nicht prüfen, ob etwas empty() oder isset() ist innerhalb einer Funktion.

function Void($var)
{
    if (empty($var) === true)
    {
        if (($var === 0) || ($var === '0'))
        {
            return false;
        }

        return true;
    }

    return false;
}

Wenn ($var != null)

  • Dies wird einen Fehler verursachen, wenn $var nicht definiert ist.

    – Thomas Rutter

    9. Mai 2011 um 0:18 Uhr

1252570cookie-checkPHP: Was ist eine Alternative zu empty(), wo die Zeichenfolge “0” nicht als leer behandelt wird? [duplicate]

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

Privacy policy