2011-11-23 7 views
66
$arr = array(); // is this line needed? 
$arr[] = 5; 

so che funziona senza la prima linea, ma è spesso inclusi nella pratica.È necessario dichiarare array PHP prima di aggiungere valori con []?

Qual è il motivo? Non è sicuro senza di esso?

So che si può anche fare questo:

$arr = array(5); 

ma sto parlando di casi in cui è necessario aggiungere elementi uno per uno.

+2

A meno che non ti piacciano le notifiche sulle variabili non dichiarate, ti consiglio di inizializzare. Inoltre, rende solo il codice leggibile (è chiaro che '$ foo = array()' e che non era una stringa trasformata in un array, ecc.). –

+5

@ Christ Christie: Tranne che non fa scattare un avviso del genere. – BoltClock

+3

@BoltClock: dipende [la versione su cui stai lavorando] (https://bugs.php.net/bug.php?id=28151). –

risposta

77

Se non si dichiara un nuovo array, ei dati che crea/aggiorna la matrice non riesce per qualsiasi motivo, quindi qualsiasi codice futuro che tenta di utilizzare la matrice sarà E_FATAL perché la matrice non esiste.

Ad esempio, foreach() genera un errore se l'array non è stato dichiarato e non sono stati aggiunti valori. Tuttavia, non si verificheranno errori se l'array è semplicemente vuoto, come sarebbe il caso lo avessi dichiarato.

+0

Venerato perché l'esempio di 'foreach' e il fatto che un errore venga attivato dipende apparentemente dalla versione di PHP in esecuzione. – cspray

+0

Non capisco quella risposta. Non dichiarato e non aggiunto qualcosa significa che non ho scritto nel codice sorgente. – Gordon

+2

@Gordon, esempio di qualcosa che non funzionerà correttamente se $ qualcosa non è uguale a 1: if ($ qualcosa == 1) {$ rows [] = "a"; $ rows [] = "b"; } foreach ($ rows as $ row) {} L'errore avrebbe potuto essere evitato se $ rows fosse stata dichiarata $ rows = array(); prima che succedesse la dichiarazione if. – djdy

4

è solo una buona pratica. Diciamo che stavi accodando il tuo array all'interno di un loop (pratica abbastanza comune), ma poi accedendo alla matrice al di fuori di detto ciclo. Senza una dichiarazione dell'array, il tuo codice genererebbe errori se non lo avessi mai fatto nel ciclo.

0

Dipende dal vostro controllo degli errori. Se si verificano segnalazioni di errori in modo rigoroso, verrà fornito un avviso, ma dovrebbe comunque funzionare tecnicamente senza di esso.

0

La sua buona nel caso in cui quando ne avete bisogno come una variabile globale o vogliono riutilizzare più e più volte la stessa matrice in diverse funzioni

13

PHP è un linguaggio debolmente tipizzato. È perfettamente accettabile Detto questo, i veri programmatori dichiarano sempre i loro vars.

+26

[programmatori reali] (https://www.xkcd.com/378/) – Gordon

+1

@Gordon esattamente quello che stavo pensando;) – AlienWebguy

-1

D'accordo con @djdy, una sola alternativa mi piacerebbe inserire:

<?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 

?> 
+0

Qual è il punto di tutto questo? Sembra molto rumore per niente letteralmente. – BoltClock

+0

Invece di pre-dichiarare la variabile $ items controllerai l'esistenza di un ciclo, tutto qui. – Otar

21

Volevo solo sottolineare che il PHP documentation on arrays in realtà parla di questo nella documentazione.

Dal sito PHP, con il codice accompagnamento frammento:

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

"Se $arr non esiste ancora, verrà creato, quindi questo è anche un modo alternativo per creare un array".

Ma, come hanno affermato le altre risposte ... dovresti davvero dichiarare un valore per le tue variabili perché qualsiasi cosa brutta può accadere se non lo fai.

6

Pensate dei programmatori che vengono dopo di te! Se basta vedere $arr[] = 5, non avete idea di quello che potrebbe essere $arr senza leggere tutto il codice precedente nel campo di applicazione. La linea esplicita $arr = array() lo rende chiaro.

+1

In PHP 5.4.x - 5.6.x: $ arr = [] funziona anche. –

1

Consiglio vivamente di dichiarare la matrice prima di aggiungere valori. Oltre a tutto quanto sopra menzionato, se l'array si trova all'interno di un loop potresti inserire involontariamente elementi nel tuo array. Ho appena osservato questo creando un bug costoso.

//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 
     } 
} 
+0

Non fare cosa ?? – ryanve

+1

@ryanve ho modificato la risposta – ykay

Problemi correlati