Überprüfen Sie, ob var vorhanden ist, bevor Sie es in PHP deaktivieren.

86

Sollten Sie beim Deaktivieren einer Variablen in PHP oder bei bewährten Methoden beim Deaktivieren einer Variablen in PHP prüfen, ob sie zuerst vorhanden ist (in diesem Fall nicht immer vorhanden) und ob sie deaktiviert oder nur deaktiviert wurde?

<?PHP
if (isset($_SESSION['signup_errors'])){
    unset($_SESSION['signup_errors']);
}

// OR

unset($_SESSION['signup_errors']);
?>
JasonDavis
quelle
2
Vgl. dk2.php.net/unset#77310
jensgram
1
Es ist effizienter zu NOTbedienen isset. Schau dir meine Antwort an. Ich habe Tests durchgeführt, um den Geschwindigkeitsunterschied zu ermitteln.
Dan Bray

Antworten:

166

Deaktivieren Sie es einfach, wenn es nicht existiert, wird nichts getan.

João Silva
quelle
3
Ich wusste nicht, ob es eine Warnung oder einen Hinweis werfen würde
JasonDavis
19
@SilentGhost Ich stimme zu, es scheint ein so einfacher Test zu sein, aber sie bitten um professionellen Rat, und obwohl das Fehlerprotokoll möglicherweise keinen Fehler / keine Warnung / keinen Hinweis zum Aufheben einer undefinierten Variable enthält, könnte es andere Probleme gegeben haben, die nicht protokolliert wurden. Wenn Sie beispielsweise nicht gesetzt aufrufen, wird PHP ALLE var-Daten durchsuchen, da es nichts finden kann, während die Verwendung if setmöglicherweise ein besseres Indizierungsschema aufweist. (Nur ein Beispiel, das vorherige ist wahrscheinlich Schuster und beide Ansätze verwenden die gleiche Datenprüfmethode).
James
Stimmt, und es ist auch effizienter. Schauen Sie sich meine Antwort an, weil ich die Geschwindigkeit getestet habe, mit der issetVerse nicht verwendet werden isset.
Dan Bray
abstimmen - Sie können nicht definierte Array-Schlüssel nicht deaktivieren.
Behnam
1
@jascha Ich sagte, wir können nicht!
Behnam
47

Aus dem PHP-Handbuch :

In Bezug auf einige Verwirrung weiter oben in diesen Hinweisen darüber, was dazu führt, dass unset () Benachrichtigungen auslöst, wenn nicht vorhandene Variablen deaktiviert werden ....

Nicht vorhandene Variablen wie in deaktivieren

<?php
unset($undefinedVariable);
?>

löst keinen Hinweis "Undefinierte Variable" aus. Aber

<?php
unset($undefinedArray[$undefinedKey]);
?>

löst zwei Benachrichtigungen aus, da dieser Code zum Deaktivieren eines Elements eines Arrays dient; Weder $ undefinedArray noch $ undefinedKey werden selbst nicht festgelegt. Sie werden lediglich verwendet, um zu ermitteln, was nicht festgelegt werden soll. Wenn sie existieren würden, würden Sie immer noch erwarten, dass beide danach da sind. Sie möchten NICHT, dass Ihr gesamtes Array verschwindet, nur weil Sie eines seiner Elemente deaktiviert () haben!

Herr smith
quelle
41
Dies bedarf einer weiteren Klärung. Sie können Array-Schlüssel deaktivieren, die nicht definiert sind, solange das Array selbst vorhanden ist.
Kingmaple
@kristovaher In der Tat - dies spricht nicht das spezifische Szenario an, das das OP überhaupt beschreibt.
Mark Amery
19

Die Verwendung unseteiner undefinierten Variablen verursacht keine Fehler (es sei denn, die Variable ist der Index eines Arrays (oder Objekts), das nicht vorhanden ist).

Daher müssen Sie nur berücksichtigen, was am effizientesten ist. Es ist effizienter, nicht mit 'isset' zu testen, wie mein Test zeigen wird.

Prüfung:

function A()
{
    for ($i = 0; $i < 10000000; $i++)
    {
        $defined = 1;
        unset($defined);
    }
}

function B()
{
    for ($i = 0; $i < 10000000; $i++)
    {
        $defined = 1;
        unset($undefined);
    }
}

function C()
{
    for ($i = 0; $i < 10000000; $i++)
    {
        $defined = 1;
        if (isset($defined))
            unset($defined);
    }
}

function D()
{
    for ($i = 0; $i < 10000000; $i++)
    {
        $defined = 1;
        if (isset($undefined))
            unset($undefined);
    }
}

$time_pre = microtime(true);
A();
$time_post = microtime(true);
$exec_time = $time_post - $time_pre;
echo "Function A time = $exec_time ";

$time_pre = microtime(true);
B();
$time_post = microtime(true);
$exec_time = $time_post - $time_pre;
echo "Function B time = $exec_time ";

$time_pre = microtime(true);
C();
$time_post = microtime(true);
$exec_time = $time_post - $time_pre;
echo "Function C time = $exec_time ";

$time_pre = microtime(true);
D();
$time_post = microtime(true);
$exec_time = $time_post - $time_pre;
echo "Function D time = $exec_time";
exit();

Ergebnisse:

  1. Function A time = 1.0307259559631
    • Ohne isset definiert
  2. Function B time = 0.72514510154724
    • Undefined ohne isset
  3. Function C time = 1.3804969787598
    • Mit isset definiert
  4. Function D time = 0.86475610733032
    • Mit isset nicht definiert

Fazit:

Die Verwendung ist immer weniger effizient isset, ganz zu schweigen von der geringen zusätzlichen Zeit, die zum Schreiben benötigt wird. Es ist schneller, unseteine undefinierte Variable zu versuchen, als zu prüfen, ob dies möglich ist unset.

Dan Bray
quelle
1
Das ist viel besser als die akzeptierte Antwort! Vielen Dank, dass Sie diese Tests durchgeführt haben.
Adam Friedman
3

Wenn Sie eine Variable deaktivieren möchten, können Sie sie einfach verwenden unset

unset($any_variable); // bool, object, int, string etc

Die Überprüfung auf ihre Existenz hat keinen Vorteil, wenn versucht wird, eine Variable zu deaktivieren.

Wenn die Variable ein Array ist und Sie ein Element deaktivieren möchten, müssen Sie sicherstellen, dass das übergeordnete Element zuerst vorhanden ist. Dies gilt auch für Objekteigenschaften.

unset($undefined_array['undefined_element_key']); // error - Undefined variable: undefined_array

unset($undefined_object->undefined_prop_name); // error - Undefined variable: undefined_object

Dies lässt sich leicht lösen, indem Sie das unsetin einen if(isset($var)){ ... }Block einwickeln .

if(isset($undefined_array)){
    unset($undefined_array['undefined_element_key']); 
}

if(isset($undefined_object)){
    unset($undefined_object->undefined_prop_name); 
}

Der Grund, warum wir nur die Variable ( übergeordnet ) überprüfen, ist einfach, dass wir die Eigenschaft / das Element nicht überprüfen müssen und dies viel langsamer zu schreiben und zu berechnen wäre, da dies eine zusätzliche Prüfung hinzufügen würde.

if(isset($array)){
...
}

if(isset($object)){
...
}

.vs

$object->prop_name = null;
$array['element_key'] = null;

// This way elements/properties with the value of `null` can still be unset.

if(isset($array) && array_key_exists('element_key', $array)){
...
}

if(isset($object) && property_exists($object, 'prop_name')){
...
}

// or 

// This way elements/properties with `null` values wont be unset.

if(isset($array) && $array['element_key'])){
...
}

if(isset($object) && $object->prop_name)){
...
}

Dies ist selbstverständlich, aber es ist auch wichtig, dass Sie typedie Variable kennen, wenn Sie ein Element oder eine Eigenschaft abrufen, festlegen und deaktivieren. Bei Verwendung der falschen Syntax wird ein Fehler ausgegeben.

Dies gilt auch, wenn versucht wird, den Wert eines mehrdimensionalen Arrays oder Objekts zu deaktivieren. Sie müssen sicherstellen, dass der übergeordnete Schlüssel / Name vorhanden ist.

if(isset($variable['undefined_key'])){
    unset($variable['undefined_key']['another_undefined_key']);
}

if(isset($variable->undefined_prop)){
    unset($variable->undefined_prop->another_undefined_prop);
}

Beim Umgang mit Objekten gibt es noch etwas zu beachten, und das ist Sichtbarkeit.

Nur weil es existiert, heißt das nicht, dass Sie die Berechtigung haben, es zu ändern.

TarranJones
quelle
Endlich eine richtige Antwort. Danke dir.
wp78de
Ein kleines Update: In PHP 7.4 / 8.0 wird kein Fehler ausgegeben, wenn Sie unsetdie Eigenschaft eines nicht vorhandenen übergeordneten Objekts haben. Wenn Sie jedoch einen Schlüssel in einem nicht vorhandenen Array in PHP8 verunsichern, wird nicht nur ein Hinweis, sondern auch eine Warnung ausgegeben (Änderungen vorbehalten).
wp78de
1

Überprüfen Sie diesen Link https://3v4l.org/hPAto

Das Online-Tool zeigt die Codekompatibilität für verschiedene Versionen von PHP

Nach diesem Tool der Code

unset($_SESSION['signup_errors']);

würde für PHP> = 5.4.0 funktionieren, ohne dass Sie irgendwelche Hinweise / Warnungen / Fehler erhalten.

evgpisarchik
quelle