Бесплатные PHP скрипты - форум техподдержки

Бесплатные PHP скрипты - форум техподдержки

Форум техподдержки WR-Скриптов на php. Обсуждаем: основы программирования на PHP 5 - 7 версий, различные подходы к написанию скриптов на php 7 без MySQL. А также WR-скрипты: бесплатные доски объявлений, скрипты форумов, Гостевые книги, Каталог ссылок, Галерея, Фотоальбом, Счётчики, Рассылки, Анекдот и другие. Принимаются пожелания для новых версий. Сообщите какой скрипт нужен для Вашего сайта, постараемся найти или реализовать. Скачать скрипты можно бесплатно. Вместе мы сделаем бесплатные php скрипты лучше и доступнее!

Главная сайта бесплатных php скриптовГлавная сайта   ПоискПоиск  
Сегодня: 25.04.2024 - 12:19:28
Страницы:  1  2  

Как писать текстовые строки: ', " и 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 = $str";

(там, где переменная для вывода в конце строки)

ну а если что-то типа

Код:
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
При обработке форм теряются или возникают слэши. :Предыдущая темаСледующая тема: Помогите чайнику.
Страницы:  1  2  

Сообщение
Имя E-mail
Сообщение

Нажмите на точку возле имени для обращения к участнику

Смайлы:

Ещё смайлы
Эмодзи
         
Защитный код: (введите цифры, которые на синем фоне)
Ответ на вопрос: (Какой сейчас год?)
   
WR-Счётчик
Powered by WR-Forum Professional © 2.3 UTF-8 beta версия