Какие кавычки следует использовать в массиве и почему?

Читая различную документацию, примеры и пробуя на практике - я пришел к выводу что результат вне зависимости от кавычек одинаковый.
Т.е. любая из строк кода ниже работает и выдает одинаковый (как я считаю) результат.

$result=mysql_query("SELECT * FROM `some_table`");
$row=mysql_fetch_assoc($result); 

$id1=$row[id];
$id2=$row['id'];
$id3=$row["id"];


Какие кавычки следует использовать в массиве (или не использовать вообще) и почему?
И в любом массиве следует использовать кавычки? Я про $GET, $POST и другие "служебные" массивы.

Например тут в примере двойные кавычки, а чуть ниже в комментариях - одинарные.
php.net/manual/ru/reserved.variables.get.php
  • Вопрос задан
  • 1292 просмотра
Пригласить эксперта
Ответы на вопрос 1
dubr
@dubr
пыхарь
1) Решительно пофигу, где используются кавычки - в массиве или где-то еще. При обращении к индексу массива $a["key"] в квадратные скобки попадает выражение "key", состоящее из одного строкового литерала. Кавычки - это не часть магии, достающей что-то из массива =) Так тоже можно:

$a = ['key' => 'val'];
$k = "key";

// вау! вот это магия!!!
echo $a[$k]; 

// просто невероятно!
echo $a[ strrev('ek') . substr($k, -1, 1) ];


2) По поводу "одинарные быстрее работают": надо понимать, за счет чего они "работают быстрее". Пхп пытается найти в них переменные и специальные последовательности типа \n при разборе скрипта. То есть один раз в самом начале, а не каждый раз, когда выражение исполняется. То есть:

for ($i = 0; $i < 100500; $i++) {
	$b = $a["key"];
}


Заменив тут двойные на одинарные, почувствовать разницу не получится, несмотря на длинный цикл. Ее можно почувствовать, если у вас очень очень очень большой php-файл.

3) И я вот решил наконец выяснить, какая она, это разница =)

<?php
$s = 'return count([';

ini_set('memory_limit', '900M');

$rands = [];
$num = 1000000;
$quot = '"';

// я турбо-кавычка!
// $quot = "'"; 
// ^ ^ ^ ^ ^
// раскомментируй меня и почувствуй настояющую скорость!

for ($i = 0; $i < $num; $i++) {
    $s .= $quot. md5( rand(100000000, 999999999) . rand(100000000, 999999999) ).$quot.' => 1';
    if ($i !== $num - 1) {
    	$s .= ',' ;
    }
}
$s .= ']);';

// получилось строка:
// return count(['a' => 1, 'b' => 1, ... 1kk раз ])

$start = microtime(true);
// вот тут будет работать парсер
eval($s);

// например, 1.4128859043121 сек.
echo (microtime(true) - $start) . " сек.";


Мы генерим строку с кодом, который создает массив с миллионом ключей, каждый ключ - md5 от двух случайных чисел. eval запускает парсер и он типа 1.4128 сек отрабатывает.

Теперь раскомментируем одинарную кавычку, и видим... 1.2484261989594 сек.! То есть разница в 0.16 с на дичайшем и нереальнейшем примере =) Повторим 100 раз, у меня получилось в среднем 0.12 сек. в пользу одинарных. Это на маке с php 5.6. Погонял на VPS с php 7 - там разница 0.36 сек, но между отдельными замерами одинакового способа разброс получается сильно больше этих 0.36, так что не показательно.

4) Поэтому ориентироваться на "быстродействие" надо в последнюю очередь. На возможность вставлять переменные внутрь двойных кавычек ориентироваться тоже не надо, потому что так делать плохо, потому что читать сложнее, хорошо - закрыть кавычку, поставить точечку и дальше уже доллар (как эс) =)

В первую очередь надо ориентироваться на вероятность появления переносов строки, которые могут возникнуть в этой строке. Во вторую - на вероятность появления собственно кавычки одного из типов, потому что экранирование снижает читаемость (особенно если это регулярка, где сам слеш тоже надо экранировать). В остальных случаях можно юзать любую, но желательно одну и ту же. Например одинарную, потому что ее на клавиатуре нажимать удобнее =)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы