Der richtige Weg, um mehrere Variablen in PHP zu deklarieren

Lesezeit: 6 Minuten

Benutzer-Avatar
Tom Biakryek

Ich codiere seit Jahren persönliche Skripte in PHP und gewöhne mich daran, die Fehleranzeige auszuschalten. Ich bin dabei, einige dieser Skripte zu veröffentlichen und würde es gerne richtig machen.

Der einzige Grund, warum ich die Fehleranzeige abschalte, ist, dass ich dank isset() nicht jede einzelne Variable testen muss, bevor ich sie verwende.

Hier also meine Frage:

Gibt es eine bessere Möglichkeit, mehrere Variablen als diese zu deklarieren?

<?php
  // at the begining of my main file
  if (!isset($foo))  ($foo = '');
  if (!isset($bar))  ($bar="");
  if (!isset($ping)) ($ping = '');
  if (!isset($pong)) ($pong = '');
  // etc. for every single var
?>

So etwas zum Beispiel:

<?php
  var $foo, $bar, $ping, $pong;
?>

  • Erwartet var $foo eine leere Zeichenfolge zu sein, scheint seltsam. Welche Operationen führen Sie später durch, die Probleme verursachen?

    – Mike B

    14. Juni 2012 um 0:35 Uhr


  • Ich verstehe nicht ganz, worum es geht. Sie testen eine Variable, bevor Sie sie setzen, um zu prüfen, ob Sie sie setzen können? Kommen Sie aus einer anderen Sprache, in der Sie Variablen wie setzen müssen dim d as Integer? Ich denke, was Sie wirklich brauchen, ist eine Kapselung wie Funktionen, Klassen usw., damit Sie den globalen Namensraum verlassen und sich dann angewöhnen, Variablen am Kopf jeder Funktion/Klassenmethode zu deklarieren.

    – Jared Farrish

    14. Juni 2012 um 0:35 Uhr


  • @MikeB: ein einfacher Test. Wenn die var nicht an erster Stelle deklariert ist, wird eine einfache if ($foo == 'blabla') wird einen Fehler auslösen.

    – Tom Biakryek

    14. Juni 2012 um 0:44 Uhr

  • Woher kommen dann die Variablen? Benutzt du sowas wie extract($_GET) Variablen zu erstellen und Sie wissen nicht genau, was erstellt wurde?

    – Mike B

    14. Juni 2012 um 0:45 Uhr


  • Was sagt dieser Fehler? Ist es eine Warnung?

    – Jared Farrish

    14. Juni 2012 um 0:47 Uhr

Benutzer-Avatar
DaneSoul

<?php
  $foo = $bar = $ping = $pong = '';
?>

Wenn es Ihr Skript ist und Sie wissen, welche Variablen Sie verwenden, warum möchten Sie Rekurse ausgeben, um zu überprüfen, ob die Variable zuvor deklariert wurde?

  • Wenn Sie sie aus irgendeinem Grund nur “deklarieren” möchten, können Sie sie alle mit in eine Zeile stellen ;wie in $foo; $bar; $far; $boo;, alles in einer Zeile. Hinweis für Uneingeweihte, $foo, $bar, $far, $boo; löst einen (Parse-)Syntaxfehler aus und beendet das Skript.

    – Jared Farrish

    14. Juni 2012 um 1:21 Uhr

  • @Jared Farrish $foo; $bar; $far; $boo; werde noch werfen Notice: Undefined variable: ...

    – Jeff Puckett

    19. Juli 2016 um 16:46 Uhr

  • Werden sich dadurch nicht alle Werte ändern, wenn Sie nur den Wert einer Variablen ändern?

    – Molar

    13. Juli 2018 um 9:31 Uhr

  • molerat, NEIN, nachdem die Variablen deklariert wurden, können Sie sie separat ändern und jede behält ihren eigenen Wert.

    – DaneSoul

    14. Juli 2018 um 17:18 Uhr

  • @molerat du programmierst auch in python, oder?? Ich habe gerade angefangen, in Python zu programmieren und auf die harte Tour herausgefunden, dass das Ändern eines in der Kette alle anderen ändert. Eigentlich, warte, es war nicht Python. es war eine andere Sprache

    – alter Junge

    11. November 2018 um 23:00 Uhr


Benutzer-Avatar
TaschevollKäse

Ich habe dies zuvor in einem Kommentar gepostet, aber jemand hat vorgeschlagen, dass ich es als Antwort einreiche.

Der kürzeste und einfachste Weg, den ich mir vorstellen kann, ist:

$foo = $bar = $ping = $pong = '';

Ich ziehe es oft vor, die Dinge auf false anstatt auf einen leeren String zu setzen, damit Sie in Zukunft immer Prüfungen mit === false durchführen können, aber das ist nur eine Einstellung und hängt davon ab, wie und wofür Sie diese Variablen verwenden.

Benutzer-Avatar
powtac

Dein if() mit isset() Versuch ist der richtige Weg, das zu tun!

Aber Sie können es etwas kürzer/lesbarer schreiben, indem Sie die verwenden Ternärer Operator:

$foo = isset($foo) ? $foo : '';

Der Erste $foo wird auf den Wert nach gesetzt ? wenn der Zustand nach dem = wahr ist, sonst wird es auf den Wert nach gesetzt :. Der Zustand (zwischen = und ? ) wird immer als boolean gecastet.

Seit PHP 5.3 du kannst es auch kürzer schreiben:

$foo = isset($foo) ?: '';

Dies wird eingestellt $foo zu TRUE oder FALSE (je nachdem was isset() Returns), wie von @Decent Dabbler in den Kommentaren gezeigt. Entfernen isset() werde es einstellen '' aber es wird auch eine undefinierte Variablenmeldung auslösen (allerdings nicht in der Produktion).

Seit PHP 7 können Sie einen Null-Coalesce-Operator verwenden:

$foo = $foo ?? '';

Dies wird keinen Fehler auslösen, aber es wird als ausgewertet TRUE wenn $foo existiert und ist leer, im Gegensatz zum abgekürzten ternären Operator, der als ausgewertet wird FALSE wenn die Variable leer ist.

  • Ehrliche Frage, warum sollte man das haben wollen $foo eine leere Zeichenfolge vs null sein? Ich drehe mich im Kreis und versuche, mir einen Umstand auszudenken

    – Mike B

    14. Juni 2012 um 0:38 Uhr


  • Ich bin mir sicher, dass der Fragesteller einfach einen Standardwert festlegen möchte, in diesem Fall eine leere Zeichenfolge. Und denken Sie daran ” != NULL oder nicht gesetzt 😉

    – powtac

    14. Juni 2012 um 0:39 Uhr

  • Ich weiß nicht, ich bin bei @MikeB, ich bin seit acht Jahren ein PHP-Entwickler, der sich erholt, und ich habe so etwas noch nie systematisch gemacht, oder hatte ich ein Problem, es nicht zu tun?

    – Jared Farrish

    14. Juni 2012 um 0:41 Uhr


  • $foo = isset($foo) ?: ''; wird nicht das tun, was Sie denken, dass es tun wird. Wenn $foo eingestellt ist, wird es zugewiesen true zu $foo Egal ob $fooDer Anfangswert von .

    – Anständiger Dabbler

    14. Juni 2012 um 4:17 Uhr


Benutzer-Avatar
Connor Decker

Ein etwas umständlicher Weg, dies zu tun, besteht darin, den Namen Ihrer Variablen in ein Array zu schreiben und sie dann mit einem ternären Operator zu durchlaufen, ähnlich wie powtac‘s Antwort.

$vars = array('foo', 'bar', 'ping', 'pong');
$defaultVar="";

foreach($vars as $var)
{
    $$var = isset($$var) ? $$var : $defaultVar;
}

Wie in anderen Antworten erwähnt, können Sie mit PHP seit Version 5.3 den obigen Code wie folgt schreiben:

$vars = array('foo', 'bar', 'ping', 'pong');
$defaultVar="";

foreach($vars as $var)
{
    $$var = isset($$var) ?: $defaultVar;
}

Beachten Sie den geänderten ternären Operator.

In OOP können Sie diesen Ansatz verwenden:

protected $password, $full_name, $email;

Für Nicht-OOP deklarieren Sie sie nur im Code, sie werden undefiniert sein, wenn Sie ihnen keinen Wert zuweisen:

$foo; $bar; $baz;

$set_foo =  (isset($foo)) ? $foo : $foo = 'Foo';
echo $set_foo;

Benutzer-Avatar
jli

Warum nicht einfach einstellen?

<?php
$foo = '';
$bar="";
//etc
?>

Wenn Sie versuchen, den Wert in ihnen zu bewahren, dann ja, das ist im Allgemeinen der richtige Weg. Beachten Sie, dass Sie das zweite Klammerpaar in Ihren Anweisungen nicht benötigen:

if (!isset($foo)) $foo = '';

reicht.

Benutzer-Avatar
c0d3x1337

Um das Problem zu beheben

  <?php
  $foo = $bar = $ping = $pong = '';
  ?>

werfen

Hinweis: Undefinierte Variable: …

  <?php
  @$foo = $bar = $ping = $pong = '';
  ?>

Es wird es nicht beheben, aber es wird nicht angezeigt und das Skript wird nicht vom Parsen abgehalten.

  • Fehler/Hinweise/Warnungen zu unterdrücken ist nicht dasselbe wie sie zu beheben, und diese Praxis sollte vermieden werden.

    – TreyBake

    21. Juni 2019 um 15:34 Uhr

1335420cookie-checkDer richtige Weg, um mehrere Variablen in PHP zu deklarieren

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

Privacy policy