1

Иногда встрачаю такие записи:

$arr = array(); // зачем писать эту строку?
$arr = [1,2,3];
print_r($arr);

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

  • array() или [](это сокращение array()), в версиях ниже 5.4 это будет синтаксической ошибкой. Еще можете воспользоваться SplFixedArray иногда бывает быстрее обычного нативного array(). Вообще на самомо деле, массивы очень быстрые, если у вас еще есть опкешеры и прочие контроллеры... Может заметно ускорить процесс. – And Dec 16 '18 at 12:39

3 Answers3

4

В вашем примере первая строчка - лишняя и она не дает никакого снижения нагрузки на проц. Наверное, вы видели немного другой вариант использования инициализации массивов:

$arr = [];
$arr[1] = 'one';
print_r($arr);

В таком случае инициализировать массив необходимо ($arr = [] или $arr = array()), так как если переменная $arr была использована где-то еще ранее в коде ($arr['product_id'] = 321), то в ней могут остаться данные, что может стать сюрпризом при выборке этих данных.

Miron
  • 840
  • как связаны части предложения "в таком случае необходимо" и "так как если"? Перечитал три раза - бессмыслица какая-то. – n.osennij Dec 16 '18 at 11:20
  • @n.osennij когда вы вносите весь массив за раз, например так: $arr = [1,2,3], то все данные, которые были в переменной $arr затираются и вместо них записывается массив [1,2,3]. Но если вы вносите данные в массив без его инициализации, например где-то ранее внесли $arr['product_id'] = 321 а потом $arr[1] = 'one' то ваш массив будет содержать 2 ключа: product_id и 1, что может стать большим неприятным сюрпризом. – Miron Dec 16 '18 at 11:25
  • Это понятно. Но написано совсем не ясно, если честно. Да и пример кода не содержим в себе того, что вы описываете ниже. И никак не объясняется снижение нагрузки на проц – n.osennij Dec 16 '18 at 11:29
  • 1
    @n.osennij А тут и нет никакого снижения нагрузки на проц, поэтому это и не описано =) – Владимир Клыков Dec 16 '18 at 11:30
  • Но написано так, словно вариант задавшего вопрос не даёт снижения на проц, а код ответившего, приведённые ниже - даёт. – n.osennij Dec 16 '18 at 11:31
  • 1
    @n.osennij первую строку прочтите, про снижение нагрузки там есть, дальше разжевано для чего это может быть использовано =) – Владимир Клыков Dec 16 '18 at 11:32
  • Я про структуру и расстановку акцентов говорю. Например "Объявление переменной не увеличивает нагрузку на процессор. Что касается вашего примера, то...". Чувствуете разницу? – n.osennij Dec 16 '18 at 11:35
  • 1
    @n.osennij Если это мне адресовано - то тут нет моего примера =) А что хотел донести автор ответа - я прекрасно понял и лишь говорю об этом =) Был конкретный вопрос, есть ли тут снижение нагрузки и очень конкретный ответ: это не дает снижения нагрузки... Дальше было обьяснение где и для чего такую конструкцию использовать( и что в примере вопроса эта конструкция не несет никакого смысла), что автор ответа успешно донес, по крайней мере до меня =) – Владимир Клыков Dec 16 '18 at 11:40
  • @n.osennij и ваш и мой вариант - это одно и то же, написанное разными словами. – Miron Dec 16 '18 at 11:41
  • Видно я чуточку больше гуманитарий... Это не одно и то же. Вы пишете, что "В вашем примере нет снижения нагрузки". А дальше приводите сразу же свои примеры. Нет однозначности и закрытости вопроса. Вы говорите только о том, что именно код пользователя не даёт снижения нагрузки. Не больше. Ни меньше. И остаётся открытий вопрос - если не код пользователя даёт снижение, то какой код? Ладно, не важно. – n.osennij Dec 16 '18 at 11:46
  • @n.osennij Пожалуйста, перечитайте внимательно мой ответ. Я пищу: "В вашем примере первая строчка - лишняя и она не дает никакого снижения нагрузки на проц" - этот ответ однозначен и не нужно искать в нем скрытый смысл. – Miron Dec 16 '18 at 11:49
  • Не важно. Я уже понял, что затронул слишком тонкие материи. Проехали. – n.osennij Dec 16 '18 at 11:50
2

зачем писать эту строку?

В конкретно вашем примере - это делать не нужно. Инициализация "пустой" переменной с определением какого-то типа (string, array, integer) нужно в тех случаях, когда ниже по коду эта переменная будет принимать участие в каких-либо операциях. Например, если вы будете добавлять очередное значение в массив, то этот массив, пусть и пустой, уже должен существовать. Если будем говорить о строках, то тут может идти речь о конкатенации и чтобы "склеить" значения в переменной, в ней уже должна быть хоть какая-то строка. То же самое и числовыми типами и, например, возможных математических операциях.

$arr = [];
// где-то ниже
$arr[] = 'new value';

$str = '';
// где-то ниже
$str .= 'new value';

$int = 0;
// где-то ниже
$int++;

Что касается $arr = [] и $arr = array(), то принципиальной разницы нет. Первый вариант введен, как короткий синтаксис в PHP5.4

Deonis
  • 34,025
-3

Для читабельности. В PHP нет способа объявить массив, поэтому иногда так и пишут. Но ваш пример очень прост. Обычно присвоение непустого массива происходит где-то чуть ниже в коде.

Undefined
  • 104
  • 2
    $arr = [] - что это, как не объявление массива? – Miron Dec 16 '18 at 12:18
  • 2
    "В PHP нет способа объявить массив". А $array = [] тогда что? – u_mulder Dec 16 '18 at 12:18
  • Чуваки, учите матчасть. Это не только объявление, но ещё и операция присвоения значения(пустого массива). – Undefined Dec 16 '18 at 12:23
  • "нет способа объявить массив", "это не только объявление". Не говорите чушь. – Alexxosipov Dec 16 '18 at 12:25
  • "Не говорите чушь." - Хорошо. Продолжайте жить в мире, в котором единственный ЯП это PHP :) – Undefined Dec 16 '18 at 12:36
  • Присвоить переменной пустой массив, через [] или array() или указать SplFixedArray - фиксированный массив. Уже будет говорить о том, что в переменной находится тип массива. – And Dec 16 '18 at 12:39
  • О, я смотрю вы не только в парсинге json спец, но ещё и в PHP. Вам бы может поменьше апломба... – A K Dec 16 '18 at 15:48
  • @And: А я и не отрицаю этого. Я говорю про то, что объявление и опеределение это разные вещи. @A K: "Вам бы может поменьше апломба..." - Так же как и некоторым другим пользователям so ) – Undefined Dec 16 '18 at 21:16
  • Тем не менее, в коде в вопросе тоже присваивание, а не объявление. – Qwertiy Dec 16 '18 at 23:21