|
Бесплатные PHP скрипты - форум техподдержки |
Форум техподдержки WR-Скриптов на php. Обсуждаем: основы программирования на PHP 5 - 7 версий, различные подходы к написанию скриптов на php 7 без MySQL. А также WR-скрипты: бесплатные доски объявлений, скрипты форумов, Гостевые книги, Каталог ссылок, Галерея, Фотоальбом, Счётчики, Рассылки, Анекдот и другие. Принимаются пожелания для новых версий. Сообщите какой скрипт нужен для Вашего сайта, постараемся найти или реализовать. Скачать скрипты можно бесплатно. Вместе мы сделаем бесплатные php скрипты лучше и доступнее!
|
| Сегодня: 24.01.2025 - 16:10:48 Как писать текстовые строки: ', " и heredocОбъявление - WR-Scriptы в UTF-8 кодировке |
---|
Активно обновляю скрипты и перевожу их в UTF-8 кодировку. Список перекодированных php скриптов доступен на главной странице сайта. Скачивайте скрипты и устанавливайте на свой сайт! В ближайшее время обновлю каталог знакомств, форум Про, фотоальбом, доски объявлений лайт и ЛЮКС.
На форуме, пожалуйста, пишите что модернизировать в скриптах в первую очередь. Постараюсь исправить большую часть пожеланий! Планирую продолжить работы весь 2023 год.
|
Автор | Сообщение |
---|
pash_ka •
P гость
|
PHP предлагает целых три способа для записи строковых констанат. 1) одинарные кавычки ('); 2) двойные кавычки ("); 3) heredoc-синтаксис Какой-же из них лучше использовать? Очевидно, раз их целых три, то к увждого есть свои достоинства и недостатки.
Одинарные кавычки. Это самый простой вариант, в нём все символы кроме самих одинарных кавычек и бэкслэша (\) интерпритируются как написанно. (Одинарная кавычка интерпретируется как конец стоки, а \ - как указание, что следующую за ним ' концом строки считать не следует, а следующий за ним ещё один бэкслэш - посто символом бэкслеэша. Достоинство этого варианта в том, что он прост для обработки интерпретатором, и его скоторость выше чем у других вариантов. По этому именно его рекомендуется использовать, если Вам не нужны возможности открываемые другими синтаксисами.
Двойные кавычки. Этот синтаксис добавляет к возможностям одинарных кавычек ещё несколько. Он воспринимает символы n, r и t следующие за бэкслэшем как, соответсвенно сиимвол новой строки, символ возврата каретки и символ табуляции. Но главное, он ввоодит ещё один специальный символ - $. слово, следуюзее непосредственно за $ воспринимается как переменная и вместо него подставляется значение этой переменной. Это очень удобная функция, однако она здорово ест процессорное время. Так что не стоит ею злоупотреблять.
Существенным минусом двух описанных выше способов является то, что они требуют эскепить (предварять бэкслешем) символы одинарной или двойной кавычки. В некоторых случаях, это сильно мешает читаемости кода. И тогда на помошь приходит Heredoc-синтаксис. Он позваляет Вам самим определить последовтальность символов являющейся началом и концом текста. Пример:
Код: $text = <<EOT текст с ' и с " EOT;
|
Подробнее обо всем этом можно почитать в документации: http://www.php.net/manual/ru/language.types.string.php
Кроме того, я очень рекомендую ознакомится со стандартами написания кода в PEAR - официальной библиотеке полезных скриптов для PHP. http://pear.php.net/manual/ru/standards.php | |
|
Сообщение # 1 |
22.03.06 - 17:21:22
| | pash_ka •
P гость
|
Чуть ошибся в примере выше, там должно быть 3 символа < перед EOT.
Код: $text = <<<EOT текст с ' и с " EOT;
| А EOT - это последовательность символов которую придумывает сам программист, тут можно написать что угодно (из английских букв без пробелов). :) | |
|
Сообщение # 2 |
22.03.06 - 17:26:24
| | vladik-kiev •
V гость
|
ну лучше всего использовать конкатенацию и одинарные кавычки | |
|
Сообщение # 3 |
22.03.06 - 20:43:25
| | pash_ka •
P гость
|
vladik-kiev, Обычно я так и делаю, но зачастую это приводит к менее читабельному коду. И где-то (уже не помню где, так что ссылку дать не могу) я читал, что в случае если переменная должна находится внутри строки, следует использовать двойные кавычки. В общем, все должно быть в меру... :) | |
|
Сообщение # 4 |
22.03.06 - 21:35:47
|
Традиционные контактные линзы у нас на сайте. | vladik-kiev •
V гость
|
если интерпритатор встречает в двойных кавычках знак $, то он жадно начинает анализировать каждый следующий символ строки. Вывод: вполне обосновано использовать двойные кавычки в случаях типа:
Код: (там, где переменная для вывода в конце строки)
ну а если что-то типа
Код: echo 'Строка равна '.'$str.' и это окончательный результат'; |
то, тогда так правильней | |
|
Сообщение # 5 |
22.03.06 - 22:48:25
| | pash_ka •
P гость
|
vladik-kiev, откуда такая информмация, что на символы строки после $ уходит значительно больше времени? ИМХО, это не логично. Логично только до первого пробельного символа, да и то... ну откуда там намного больше? Один if и всё. А ещё, можно-же так писать: 'строка с {$var}еменными'. Тогда как по твоему все происходит?
ИМХО, строки c одинарными и двойными кавычками просто разными движками обрабатываются. Для одинарных вполне применимо что-то аналогичное str_replace() а для двойных - регэкспы либо специально оптимизированный алгоритм.
| |
|
Сообщение # 6 |
23.03.06 - 10:10:44
| | pash_ka •
P гость
|
Я тут ещё подумал... Моё последнее предположение, всё-таки, маловероятно: обработка строк должна происходить при парсинге файла, вместе с разбором всего синтаксиса PHP. Так что у них там явно что-то своё оптимизированное. А что - надо исходники смотреть.
Или тестировать. :) Что я и проделал: (скачать: http://webfile.ru/873994 до 06.04.2006)
Результаты:
Цитата: С:tmp>php stringSpeedTest.php Test: single quotes; Time: 0.24204397201538 Test: double quotes; Time: 0.24979591369629 Test: single quotes with var at the end; Time: 1.1971368789673 Test: double quotes with var at the end; Time: 3.8660011291504 Test: single quotes with var in the middle; Time: 1.4209899902344 Test: double quotes with var in the middle; Time: 4.080913066864 Test: eval with single quotes; Time: 1.7215631008148 Test: eval with single quotes; Time: 1.8116869926453
С:tmp>php stringSpeedTest.php Test: single quotes; Time: 0.24448990821838 Test: double quotes; Time: 0.24013090133667 Test: single quotes with var at the end; Time: 1.1941840648651 Test: double quotes with var at the end; Time: 3.8118991851807 Test: single quotes with var in the middle; Time: 1.44912981987 Test: double quotes with var in the middle; Time: 3.8084948062897 Test: eval with single quotes; Time: 16.566662073135 Test: eval with single quotes; Time: 16.25111579895
С:tmp>php stringSpeedTest.php Test: single quotes; Time: 0.36321401596069 Test: double quotes; Time: 0.2574520111084 Test: single quotes with var at the end; Time: 1.26154088974 Test: double quotes with var at the end; Time: 3.8604860305786 Test: single quotes with var in the middle; Time: 1.4512770175934 Test: double quotes with var in the middle; Time: 3.9657039642334 Test: eval with single quotes; Time: 16.523555040359 Test: eval with single quotes; Time: 16.592787027359
| | |
|
Сообщение # 7 |
23.03.06 - 14:01:39
| | pash_ka •
P гость
|
Что это значит: 1) Просто строки, без переменных, обабатываются быстро что во варианте с двойной, что с одинарной кавычкой. Что быстрее - вопрос не до конца ясный, требует более детального изучения.
2) Строки с одинарными кавычками и переменными вставленными в них через конкатенацию ('this is a '.$var) обрабатываются на порядок дольше строк без переменных, но с синтаксис с двойными кавычками - ещё более чем вдвое дольше!
Тест eval() был сделан чтобы проверить предположение о том, что парсить строку с двойными кавычками дольше. В остальных тестах строка, вероятно, парсится при чтении файла скрипта. eval() парсит строку во время выполнения (поэтому увеличение времени на два порядка по сравнению с просто строками).
Во всех тестах я использую цикл в котром несколько (10) раз выполняю практисески одинаковую операцию. Это нужно чтобы исключить влияние самого цикла на время выполнения. | |
|
Сообщение # 8 |
23.03.06 - 14:09:59
| | pash_ka •
P гость
|
Если кому интересен код теста а качать лень, вот он:
Код: <?php /** * Проверка скорости обработки PHP строк с различным синтаксисом. * Автор: pash_ka. * * Внимание! Скрипт работает только на PHP5, т.к. использует функцию microtime(true). * Для рабты с PHP4 следует внести исправления в testStart() и testEnd() * Подробнее про microtime() - RTFM: http://ru.php.net/manual/ru/function.microtime.php */
define('CYCLES', 100000); //Количество итераций в цикле проверки. Увеличить на очень быстрых машинах, уменьшить на медленных.
if(!isset($argsv)){ //Если запущен из под WEB-сервера а не из коммандной строки header('Content-type: text/plain'); header('Content-Disposition: inline; filename='.basename(__FILE__, '.php').'.txt'); }
//Тест одинарных кавычек testStart(); for($i=0; $i<CYCLES; $i++){ $str = 'test string 0'; $str = 'test string 1'; //... $str = 'test string 9'; } $time = testEnd(); outputResult('single quotes', $time); //Тест двоиных кавычек testStart(); for($i=0; $i<CYCLES; $i++){ $str = "test string 0"; //... $str = "test string 9"; } $time = testEnd(); outputResult('double quotes', $time);
//Тест одинарных кавычек c переменной в конце testStart(); for($i=0; $i<CYCLES; $i++){ $str = 'test string 0 '.$i; //... $str = 'test string 9 '.$i; } $time = testEnd(); outputResult('single quotes with var at the end', $time); testStart(); for($i=0; $i<CYCLES; $i++){ $str = "test string 0 $i"; //... $str = "test string 9 $i"; } $time = testEnd(); outputResult('double quotes with var at the end', $time);
//Тест одинарных кавычек c переменной в середине testStart(); for($i=0; $i<CYCLES; $i++){ $str = 'test '.$i.' string 0'; //... $str = 'test '.$i.' string 9'; } $time = testEnd(); outputResult('single quotes with var in the middle', $time); testStart(); for($i=0; $i<CYCLES; $i++){ $str = "test $i string 0"; //... $str = "test $i string 9"; } $time = testEnd(); outputResult('double quotes with var in the middle', $time);
//Тест eval с одинарными кавычками testStart(); $tpl = "\$str = 'test string';"; for($i=0; $i<CYCLES; $i++){ eval($tpl);eval($tpl);eval($tpl);eval($tpl);eval($tpl);eval($tpl);eval($tpl);eval($tpl);eval($tpl);eval($tpl); } $time = testEnd(); outputResult('eval with single quotes', $time); //Тест eval с двойными кавычками testStart(); $tpl = '$str = "test string";'; for($i=0; $i<CYCLES; $i++){ eval($tpl);eval($tpl);eval($tpl);eval($tpl);eval($tpl);eval($tpl);eval($tpl);eval($tpl);eval($tpl);eval($tpl); } $time = testEnd(); outputResult('eval with double quotes', $time);
function outputResult($name, $time){ echo 'Test: '.$name.'; Time: '.$time.chr(10); }
function testStart(){ global $testStartTime; $testStartTime = microtime(true); } function testEnd(){ global $testStartTime; return microtime(true) - $testStartTime; } ?>
| | |
|
Сообщение # 9 |
23.03.06 - 20:23:34
| | WR •
W Участник форума
|
Я тоже читал про эти особенности php. Но я по преждему считаю что данные все рассуждения применимы для крупных/серьзных проектов. Иногад чтобы сэкономить одну секунду работы скрипта - проще исключить лишнюю графику или кусок ненужного юзеру кода или исключить обработку какого-либо блока скрипта. | |
|
Сообщение # 10 |
24.03.06 - 09:28:03
| | vladik-kiev •
V гость
|
вроде, то что я говорил подтвердилось... а читал я это в какой-то книге, из тех, что читал, при чем она мне очень понравилась тем, что там довольно много посвящено тестам таких похожих методов: какой быстрее, надежней и т.д. | |
|
Сообщение # 11 |
25.03.06 - 00:14:58
| | pash_ka •
P гость
|
vladik-kiev, Подтвердилось что двойные кавычки медленнее одинарных когда в них всавляются переменные. :) Но смысл вставлять переменные в двойные кавычки - улучшение читабельности. И в некоторых ситуациях, это важнее скорости. :) А вот информация о том, что переменная в середине работает медленне чем переменная в конце - осталось спорным. (Из трех измерений которые я привел в одном в середине оказалось быстрее, а в двух других - разница была незначительная.) | |
|
Сообщение # 12 |
26.03.06 - 11:56:24
| |
|