Меня вот всё интересует вопрос, почему народ пишет HTML код в двойных кавычках, при этом упорно бекслеша все двойные кавычки (это ад, такое даже править не берусь - переписать с 0, либо отказаться вообще), предназначенные для обрамления значений атрибутов HTML тегов. Да и не только HTML, просто подстановка значений в строку (особенно удивляет когда это делаеться в SQL запросах - привет SQL Injection), пихают многомерные масивы в { } конструкции и.т.д. Я уж не придираюсь к тому, что двойные кавычки сами по себе медленее работают, а когда ещё приходиться разбирать всякие подстановки многомерных масивов, результатов работы функций и.т.д., то быстродействие ещё больше снижаеться.
Psih Одинарными кавычками не сделать перевод строки никак Я пользуюсь двойными, привык еще со времен программирования на C. Насчет скорости работы: PHP, перед тем как выполнять код, сначала парсит его и превращает в последовательность команд на своем псевдоязыке, байт-код. С этой точки зрения фрагменты 'строка1,' . $var . ',строка2' и "строка1,$var,строка2" ничем не отличаются - они превратятся в одну и ту же последовательность команд. А распарсится быстрее второй фрагмент - он синтаксически проще.
Dagdamor Дык, а вот тут ты не прав - парсинг кода - это одно. А ты во время выполнения посмотри что будет http://forums.overclockers.ru/viewtopic.php?p=1852433#1852433 моё, тестил конечно довольно давно, но всё-же реальность оно отображает. Исходник там-же. На то время даже для меня тесты были не очень актуальны эти. На сегодня - актуально, ибо каждый выжатый % улучшает ситуацию, потому что работать надо с проэктами 1-2 миллиона запросов в сутки и более.
Psih Вот мои результаты: http://img159.imageshack.us/img159/7427/quoteson2.gif Разница минимальная, хотя двойные кавычки все-таки чуть медленнее. НО: у меня установлен опкод кеш, скорее всего дело в этом.
Vladson и Psih - согласен ... правда сам иногда всетаки пишу и в двойных ... но тупо отучиваю себя от этого! с другом сами мерели .... тупо встовляли большой текст один раз с ', второй - "! выигрыш абалденный!!!!! всем советую переучится!
Dagdamor Ну в 5-й версии разница уже поменьше, видно соптимизировали. Такие вещи надо тестить на более-менее законченных скриптах, которые генерируют всю страницу сразу, ибо на одной строчке с одной переменной, сами понимаете, тест получаеться практически академическим...
В принципе разница в кавычках очень маленькая и иногда её не стоит принимать во внимание (т.е только в качестве "косвенного" фактора) но есть несколько основных факторов Например фактор циклы. Многие настолько мало знакомы с основами программирования что не учитывают тот фактор что в цикле где идут тысячи операций даже такие мелочи как кавычки могут стать большим тормозом Или например человечекий фактор. Многие исключают возможность будующей модернизации скрипта и пишут в стиле ROM (Read only Memory) забывая что редактировать потом все эти вещи будет сложно (местами очень сложно) между тем в 99% редактировать приходится (исправляя баги, и.т.д.) никто не застрахован от багов и ошибок.
Запустил твой код под PHP 5.2.0 разница большая Сам всё время использую одинарные кавычки, а когда надо добавить перевод строки то: Код (Text): 'Hello world!' . "\n"
dark-demon Не знаю, но местами мне chr(13) нравится больше (хотя в теории он тормознутее должен быть)
PHP: <?php $pages[] = "<td class="link_cell"><a href="".HTTP."://".DOMAIN."/".PATH."/".$file."&page=".$i."".SID."" class="link_cell">".$i."</a></td><td> </td>"; об этом речь?! дык. значит на такое предлагаете заменить PHP: <?php $pages[] = '<td class="link_cell"><a href="'.HTTP.'://'.DOMAIN.'/'.PATH.'/'.$file.'&page='.$i.''.SID.'" class="link_cell">'.$i.'</a></td><td> </td>'; один фиг, одинакого читается. а вот про скорость - это интересно.
Да ничего интересного в скорости - копейки. Пишу одинарные кавычки всегда, потому что: 1. в строке PHP: <?php echo '<a href="/fullimage'.$id.'_1.php" target="_blank"><img src="/'.$iname.'" '.$isize[3].' alt="'.$alt.'" title="Щелкните левой кнопкой мыши чтобы увеличить изображение"></a>'; ?> я четко вижу в редакторе (с подсветкой синтаксиса) где у меня переменные, а где просто строка; 2. апостроф нажимается без шифта
Ничего загадочного, просто для двойных запускается парсер для замены всяких \t \n \r и прочих заслешенных радостей.
korchasa Не в этом дело. Парсер обрабатывает строку один раз, и переводит ее в байт-код один раз. Есть там спецсимволы, нет - парсеру один фиг, как и у любого клеточного автомата, его скорость зависит не столько от сложности выражения, сколько от длины исходного текста. Причины того, что "" строки медленнее '', несколько хитрее. AlexGousev У меня, как ни странно, переменные отображаются другим цветом и внутри строк в двойных кавычках тоже.
ИМХО, Оффтоп. Сам пишу одинарные ковычки, по единственной причине, коей часто руководствуюсь — однозначность выполнения кода. Просто буду знать, что 100% переменная не слипнется с текстом в строке и не вычислится/отобразится случайно другое значение, а если опечатаюсь — увижу ошибку. Полу-аргумент 2 — Иногда, хоть и нечасто, приходится определять HTML/JavaScript внутри строковой переменной, и легко обломится в слешировании этого всего.
И не только заслешенных радостей, а так-же всех $bla, {$this->bla('blabla')}, {date("Y-m-d")}, {$array[0]}, {$array['hahaha']} и.т.д. Чем больше такой мути в строке, тем медленнее работает парсер, потому что обрабатывать строку надо во время выполнения, а не во время парсинга скрипта. Если у кому не лень - выше я давал ссылку, ам есть скрипт. Модифицируйте его так, что бы приблизить к реалньости ближе и посмотрим на резалты.
точно также считаю (хотя иногда в коротких конструкциях типа include "тра-ля-ля.рнр"; бывает ставлю двойные чисто случайно) "слеширование" очень важный аргумент кстати.
Psih В смысле, обрабатывать? Ты думаешь, что кроме парсинга строки, там еще есть какая-то дополнительная обработка?
Dagdamor А как потвоему он подставляет в строку значения переменных, элементов масивов, результаты работ функций и методов объектов? Конструкция вида Код (Text): $str = 'blabla'.func('ha').' blah '.$someint; Обрабатываеться парсером PHP, преобразовыветься в байткод и просто исполняеться - функция вернёт значение, оно приклееться к строке, приклееться блах и потом значение переменной $someint. А конструкция типа Код (Text): $str = "blabla{func('ha')} blah $someint"; Обрабатываеться парсером как переменная равно строке. И когда до этого места доходит, то запускаеться парсер обрабоки строк в " " кавычках. Он находит там вызов функции, вызывает её, получает результат и заменяет {func('ha')} на значение функции. Потом находит в строке $someint и заменяеть $someint на её значение. Я не знаю внутреннего устройства конечно, но здравый смылс говорит, что примерно так и должно это работать. Согласитесь, парсинг и замена в строке явно медленее чем прямое выполнение байткода. И чем больше будет переменных/функций в " " кавычках, тем больше будет осуществляться поиск и подстановка данных.
Редкое извращение ИМХО, в таких случаях я использую конкатенацию: PHP: <? $str = "blabla" . func("ha") . " blah $someint"; ?> А сам я используй двойные кавычки чтобы спец. символы использовать и не использовать конкатенацию.
Psih Мне здравый смысл подсказывает наоборот: конструкция вида "blabla{func('ha')} blah $someint" после завершения парсинга выглядит как "blabla" . func('ha') . " blah " . $someint, то есть примерно так же, как и аналогичное выражение в одинарных кавычках (откуда идут тормоза - это другой вопрос), и никакой дополнительный парсинг во время выполнения не требуется. Доказать это можно на таком примере: PHP: $str1="okay"; echo "str1 parsed<br>"; $str2="parse error: {$.}"; echo "str2 parsed<br>"; Если бы PHP использовал "отложенный" парсинг, как ты утверждаешь, то парсер нормально пропустил бы третью строку, так как синтаксис в ней нарушается только выражением "{$.}", и ошибка парсинга выявилась бы только на этапе выполнения, после того, как появится надпись "str1 parsed". Поскольку надпись не появляется (проверь сам), делаем вывод, что строка парсится полностью и никакого дополнительного парсинга во время выполнения не требуется. Еще одно доказательство - тесты с установленным опкод оптимизатором. Там скорость одинарных и двойных кавычек почти не различается.
Я не говорю про опкоды. Строка туда попадает одинаковой, и при одинарных, и при двойных кавычках. Дизассемблер так показывает по крайней мере. А скорость конечного автомата пропорциональная как длине строки, так и размеру словаря. В случае двойных кавычек словарь гораздо длиннее.