Muss das PHP-Array deklariert werden, bevor Werte mit [] hinzugefügt werden?

81
$arr = array(); // is this line needed?
$arr[] = 5;

Ich weiß, dass es ohne die erste Zeile funktioniert, aber es ist oft in der Praxis enthalten.

Was ist der Grund? Ist es ohne es unsicher?

Ich weiß, dass Sie dies auch tun können:

 $arr = array(5);

Ich spreche jedoch von Fällen, in denen Sie Elemente einzeln hinzufügen müssen.

Ryanve
quelle
2
Sofern Sie keine Hinweise zu nicht deklarierten Variablen mögen, würde ich die Initialisierung empfehlen. Außerdem wird nur lesbarer Code erstellt (es ist klar, $foo = array()dass es sich nicht um eine Zeichenfolge handelt, die in ein Array usw. umgewandelt wurde).
Brad Christie
6
@Brad Christie: Nur dass das keinen solchen Hinweis auslöst.
BoltClock
3
@BoltClock: Hängt davon ab, an welcher Version Sie arbeiten .
Brad Christie

Antworten:

92

Wenn Sie kein neues Array deklarieren und die Daten, die das Array erstellen / aktualisieren, aus irgendeinem Grund fehlschlagen, wird jeder zukünftige Code, der versucht, das Array zu verwenden, E_FATALfunktionieren, da das Array nicht vorhanden ist.

foreach()Wird beispielsweise einen Fehler auslösen, wenn das Array nicht deklariert wurde und keine Werte hinzugefügt wurden. Es treten jedoch keine Fehler auf, wenn das Array einfach leer ist, wie es der Fall wäre, wenn Sie es deklariert hätten.

djdy
quelle
Upvoted, da das foreachBeispiel und die Tatsache, dass ein Fehler ausgelöst wird, anscheinend von der Version von PHP abhängen, die Sie ausführen.
Charles Sprayberry
1
Ich verstehe diese Antwort nicht. Nicht deklariert und nicht hinzugefügt bedeutet, dass ich nicht in den Quellcode geschrieben habe.
Gordon
2
@Gordon, Beispiel für etwas, das nicht richtig funktioniert, wenn $ etwas nicht gleich 1 ist: if ($ etwas == 1) {$ rows [] = "a"; $ rows [] = "b"; } foreach ($ rows as $ row) {} Der Fehler hätte vermieden werden können, wenn $ rows als $ rows = array () deklariert worden wäre. vor der if-Anweisung passiert.
Djdy
1
Ich stimme zu (ich habe abgestimmt), aber das Leben ist zu kurz, um immer alles zu erklären, obwohl wir wissen, dass es das "Richtige" ist. Alternativ können Sie vermutlich is_array () verwenden, wenn Sie sich Sorgen über nicht deklarierte Arrays machen. Wie die meisten Dinge, hängt von den Einzelheiten ab.
PJ Brunet
24

Ich wollte nur darauf hinweisen, dass die PHP-Dokumentation inarrays der Dokumentation tatsächlich darüber spricht.

Von der PHP-Site mit dem dazugehörigen Code-Snippet:

$arr[key] = value;
$arr[] = value;
// key may be an integer or string
// value may be any value of any type

"Wenn es $arrnoch nicht vorhanden ist, wird es erstellt. Dies ist also auch eine alternative Möglichkeit, ein Array zu erstellen."

Aber wie in den anderen Antworten angegeben ... sollten Sie wirklich einen Wert für Ihre Variablen deklarieren, da alle möglichen schlechten Dinge passieren können, wenn Sie dies nicht tun.

Charles Sprayberry
quelle
15

PHP ist eine lose getippte Sprache. Es ist vollkommen akzeptabel. Davon abgesehen deklarieren echte Programmierer immer ihre Vars.

AlienWebguy
quelle
1
@ Gordon genau das, was ich dachte;)
AlienWebguy
6

Denken Sie an die Programmierer, die nach Ihnen kommen! Wenn Sie nur sehen $arr[] = 5, haben Sie keine Ahnung, was sein $arrkönnte, ohne den gesamten vorhergehenden Code im Bereich zu lesen. Die explizite $arr = array()Linie macht es klar.

Rob Agar
quelle
1
In PHP 5.4.x - 5.6.x funktioniert auch $ arr = [].
Anthony Rutledge
4

Es ist nur eine gute Übung. Angenommen, Sie haben innerhalb einer Schleife an Ihr Array angehängt (ziemlich übliche Praxis), dann aber außerhalb dieser Schleife auf das Array zugegriffen. Ohne eine Array-Deklaration würde Ihr Code Fehler auslösen, wenn Sie es nie in die Schleife geschafft hätten.

Julien
quelle
3

Ich empfehle dringend, das Array zu deklarieren, bevor Sie Werte hinzufügen. Wenn sich das Array in einer Schleife befindet, können Sie neben allem, was oben erwähnt wurde, unbeabsichtigt Elemente in Ihr Array verschieben. Ich habe gerade beobachtet, dass dies einen kostspieligen Fehler verursacht.

//Example code    
foreach ($mailboxes as $mailbox){
       //loop creating email list to get
       foreach ($emails as $email){
          $arr[] = $email;
       }
       //loop to get emails
       foreach ($arr as $email){
       //oops now we're getting other peoples emails
       //in other mailboxes because we didn't initialize the array
       }
}
ykay sagt Reinstate Monica
quelle
Nicht was machen ??
Ryanve
1

Wenn Sie ein Array vor der Verwendung nicht deklarieren, kann dies zu Problemen führen. Eine Erfahrung, die ich gerade gefunden habe, ich habe dieses Testskript wie folgt aufgerufen: indextest.php? File = 1STLSPGTGUS Dies funktioniert wie erwartet.

//indextest.php?file=1STLSPGTGUS
$path['templates']     = './mytemplates/';
$file['template']      = 'myindex.tpl.php';
$file['otherthing']      = 'otherthing';
$file['iamempty']    = '';

print ("path['templates'] = " . $path['templates'] . "<br>");
print ("file['template'] = " . $file['template'] . "<br>");
print ("file['otherthing'] = " . $file['otherthing'] . "<br>");
print ("file['iamempty'] = " . $file['iamempty'] . "<br>");

print ("file['file'] = " . $file['file'] . "<br>");// should give: "Notice: Undefined index: file"
print ("file = " . $file);// should give: "Notice: Undefined index: file"

//the Output is:
/*
path['templates'] = ./mytemplates/
file['template'] = myindex.tpl.php
file['otherthing'] = otherthing
file['iamempty'] =

Notice: Undefined index: file in D:\Server\Apache24\htdocs\DeliverText\indextest.php on line 14
file['file'] =

Notice: Array to string conversion in D:\Server\Apache24\htdocs\DeliverText\indextest.php on line 15
file = Array
*/

Jetzt benötige ich nur noch eine Datei aus einem anderen Skript, das ich oben gekauft habe, und wir können sehen, wie die Werte für die Array $ -Datei völlig falsch sind, während der Array $ -Pfad in Ordnung ist: "checkgroup.php" ist der Schuldige.

//indextest.php?file=1STLSPGTGUS
require_once($_SERVER['DOCUMENT_ROOT']."/IniConfig.php");
$access = "PUBLIC";
require_once(CONFPATH . "include_secure/checkgroup.php");
$path['templates']     = './mytemplates/';
$file['template']      = 'myindex.tpl.php';
$file['otherthing']      = 'otherthing.php';
$file['iamempty']    = '';

print ("path['templates'] = " . $path['templates'] . "<br>");
print ("file['template'] = " . $file['template'] . "<br>");
print ("file['otherthing'] = " . $file['otherthing'] . "<br>");
print ("file['iamempty'] = " . $file['iamempty'] . "<br>");

print ("file['file'] = " . $file['file'] . "<br>");
print ("file = " . $file);

//the Output is:
/*
path['templates'] = ./mytemplates/
file['template'] = o
file['otherthing'] = o
file['iamempty'] = o
file['file'] = o
file = oSTLSPGTGUS
*/

Das Array vorher initialisieren, dann kein Problem!

//indextest.php?file=1STLSPGTGUS
require_once($_SERVER['DOCUMENT_ROOT']."/IniConfig.php");
$access = "PUBLIC";
require_once(CONFPATH . "include_secure/checkgroup.php");

$path = array();
$file = array();

$path['templates']     = './mytemplates/';
$file['template']      = 'myindex.tpl.php';
$file['otherthing']      = 'otherthing.php';
$file['iamempty']    = '';

print ("path['templates'] = " . $path['templates'] . "<br>");
print ("file['template'] = " . $file['template'] . "<br>");
print ("file['otherthing'] = " . $file['otherthing'] . "<br>");
print ("file['iamempty'] = " . $file['iamempty'] . "<br>");

print ("file['file'] = " . $file['file'] . "<br>");
print ("file = " . $file);

//the Output is:
/*
path['templates'] = ./mytemplates/
file['template'] = myindex.tpl.php
file['otherthing'] = otherthing.php
file['iamempty'] =
file['file'] =
file = Array
*/

Auf diese Weise wurde mir klar, wie wichtig es ist, Variablen zu initialisieren, da wir nie wissen, mit welchem ​​Problem wir später enden könnten, und nur um Zeit zu sparen, verschwenden wir am Ende möglicherweise noch mehr. Ich hoffe, dass dies für diejenigen wie mich hilfreich ist, die nicht professionell sind.

Dan Bon
quelle
1

Alte Frage, aber ich teile dies, da dies ein Anwendungsfall ist, in dem Code einfacher ist, wenn Arrays nicht deklariert sind.

Angenommen, Sie haben eine Liste von Objekten, die Sie für eine ihrer Eigenschaften indizieren müssen.

// $list is array of objects, all having $key property.
$index = [];
foreach ($list as $item)
    $index[$item->key][] = $item; // Dont care if $index[$item->key] already exists or not.
Jaisson
quelle
0

Dies hängt von Ihrer Fehlerprüfung ab. Wenn Sie eine Fehlermeldung für strikt haben, erhalten Sie eine Benachrichtigung, die jedoch technisch immer noch ohne diese Funktion funktionieren sollte.

brenjt
quelle
0

Dies ist gut, wenn Sie es als globale Variable benötigen oder dasselbe Array in verschiedenen Funktionen immer wieder verwenden möchten

Vinit
quelle
0

Dies ist Ihr Code

$var[]  = 2;
print_r($var)

Funktioniert gut! bis jemand den gleichen Variablennamen vor Ihrem charmanten Code deklariert

$var = 3; 

$var[]  = 2;
print_r($var)

Warnung: Es kann kein Skalarwert als Array verwendet werden

Hoppla!

Dies ist ein möglicher (manchmal unvorhersehbarer) Fall, daher wird ja $var = array()benötigt

$var = 3;
$var = array();
$var[]  = 2;
print_r($var)

Ausgabe

Array
(
    [0] => 2
)
Regen
quelle
-1

Stimmen Sie mit @djdy überein, nur eine Alternative, die ich gerne posten würde:

<?php

// Passed array is empty, so we'll never have $items variable available.
foreach (array() AS $item)
    $items[] = $item;

isset($items) OR $items = array(); // Declare $items variable if it doesn't exist

?>
Otar
quelle
Was ist der Sinn von all dem? Scheint viel Lärm um buchstäblich nichts.
BoltClock
Anstatt die Variable $ items vorab zu deklarieren, überprüfen Sie die Existenz einer Schleife, das ist alles.
Otar