Нужно ли объявлять массив PHP перед добавлением значений с помощью []?

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

Я знаю, что это работает без первой строки, но часто используется на практике.

В чем причина? Это безопасно без него?

Я знаю, что вы также можете это сделать:

 $arr = array(5);

но я говорю о случаях, когда вам нужно добавлять элементы по одному.

Ответ 1

Если вы не объявляете новый массив, а данные, которые создают/обновляют массив, не подходят по какой-либо причине, тогда любой будущий код, который пытается использовать массив, будет E_FATAL, потому что массив не существует.

Например, foreach() выдаст ошибку, если массив не был объявлен, и никакие значения не были добавлены к нему. Однако никаких ошибок не произойдет, если массив просто пуст, как и в случае, если бы вы его объявили.

Ответ 2

Просто хочу отметить, что документация PHP на arrays действительно об этом говорит в документации.

С сайта PHP с сопроводительным фрагментом кода:

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

"Если $arr еще не существует, он будет создан, поэтому это также альтернативный способ создания массива."

Но, как говорили другие ответы... вы действительно должны объявить значение для своих переменных, потому что всевозможные плохие вещи могут произойти, если вы этого не сделаете.

Ответ 3

Php - это свободно типизированный язык. Это вполне приемлемо. При этом настоящие программисты всегда декларируют свои вары.

Ответ 4

Подумайте о кодеров, которые придут после вас! Если вы просто видите $arr[] = 5, вы не знаете, что может быть $arr без чтения всего предыдущего кода в области. Явная строка $arr = array() дает понять.

Ответ 5

это просто хорошая практика. Скажем, вы добавляли к вашему массиву внутри цикла (довольно распространенная практика), но затем обращались к массиву вне указанного цикла. Без объявления массива ваш код будет вызывать ошибки, если вы никогда не попали в цикл.

Ответ 6

Я настоятельно рекомендую объявить массив перед добавлением значений. Помимо всего перечисленного выше, если массив находится внутри цикла, вы можете непреднамеренно вставить элементы в свой массив. Я просто заметил, что это создает дорогостоящую ошибку.

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

Ответ 7

Не объявляя массив перед использованием, он может действительно вызвать проблемы. Один опыт, который я только что нашел, я назвал этот тестовый скрипт следующим образом: indextest.php? File = 1STLSPGTGUS Это работает, как и ожидалось.

//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
*/

Теперь мне просто понадобится файл из другого купленного мной скрипта вверху, и мы увидим, как значения совершенно неверны для массива $ file, в то время как массив $ path в порядке: виноват "checkgroup.php".

//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
*/

Инициализация массива раньше, тогда без проблем!

//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
*/

Именно поэтому я понял, насколько важно инициализировать переменные, поскольку мы никогда не знаем, с какой проблемой мы можем столкнуться позже, и просто ради экономии времени мы могли бы в конечном итоге тратить еще больше. Я надеюсь, что это будет полезно для таких как я, кто не профессионал.

Ответ 8

Это зависит от вашей проверки ошибок. Если у вас есть сообщение об ошибках по строгим правилам, вы получите уведомление, но оно все равно будет работать без него.

Ответ 9

Хорошо, если вам это нужно как глобальная переменная или вы хотите повторно использовать один и тот же массив снова и снова в разных функциях

Ответ 10

Это твой код

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

Работает отлично! пока кто-то не объявит то же имя переменной перед вашим очаровательным кодом

$var = 3; 

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

Предупреждение: невозможно использовать скалярное значение в качестве массива

К сожалению!

Это один возможный (иногда непредсказуемый) случай, так что да, $var = array() требуется

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

Выход

Array
(
    [0] => 2
)

Ответ 11

Согласитесь с @djdy, только один вариант, который я бы хотел опубликовать:

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

?>