Строки в PHP / Хабр
В последнее время обсуждения языка PHP на хабре сводятся больше к возможностям проектировать сложные системы, что не может не радовать. Однако, просмотрев с десяток самых признаваемых веб-фреймворков (Zend Framework, Adept, CakePHP, CodeIgniter, LIMB, Symfony, MZZ и другие) я с искренним удивлением обнаружил в некоторых существенные недочеты с точки зрения элементарной оптимизации.
Одним из слабых мест является работа со строками (проблема конкатенации уже обсуждалась хабрапрограммистами) и мне решилось вспомнить свою познавательную юность и провести парочку тестов со строками, которыми мне хотелось бы поделиться.
Для того, чтобы данный топик был более технически-ориентированным, результаты оформлены в более строгой форме, что может несколько усложнить восприятие.
Итак, поехали… Задача предельно проста: провести эксперименты по скорости формирования строк из подстрок в одинарных и двойных кавычках. В принципе, этот вопрос будет актуален еще долгое время в связи с особенностями обработки строк в PHP.
Существует немало статей по базовой оптимизации скриптов как на русском, так и на других языках. Про строки там говорится мало, но отмечается факт «парсинга» строк в двойных кавычках на предмет переменных и управляющих символов (врочем, как и в официальной документации). На основе этого логично предположить, что использование строк в двойных кавычках в работе будет несколько медленнее, чем те же операции с подстроками в одинарных кавычках.
Кроме подстановки переменных в строки и конкатенации переменных с подстроками, в PHP реализован еще как минимум один способ формирования строк: работа с функцией sprintf. Логично предположить, что данный метод будет существенно уступать «стандартным» из-за лишнего вызова функции и парсинга строки внутри.
Единственное дополнение, перед тем, как я представлю вам код тестового скрипта: необходимо учитывать 2 возможных варианта работы со строками в двойных кавычках: с учетом простого и «продвинутого» стиля кодирования. На то, что переменные стоят в самом начале строк обращать внимания не стоит, наверное — они являются только примерами:
$string = "$_SERVER['HTTP_HOST'] — не администрация Ульяновской области. Мы любим русский язык и не любим тех, кто его ..."
и
$string = "{$_SERVER['HTTP_HOST']} — не администрация Ульяновской области. Мы любим русский язык и не любим тех, кто его ..."
Тест номер один.
Ну, вроде бы, все оговорки сделаны — пора показывать результаты работы. Исходный код тестировщика можно найти здесь.
Скриншоты профайлера (копии) располагаются тут, тут и тут.
По скриншотам видно, что моя гипотеза не подтвердилась. Единственно-верным оказалось предположение о работе со строками через sprintf. Наиболее быстрыми оказались функции, работающие именно с двойными кавычками.
После непродолжительного обдумывания ситуации объяснение пришло само собой: все дело в том, что эталонная строка, в которую производились подстановки является слишком короткой: проход парсера по такой строке — дело плевое. Однако, даже тут видно, что нативная подстановка переменной в строку дает преимущество перед «продвинутым стилем».
В этом же и слабость подхода конкатенации: объемы вставляемых данных превышают объемы подстрок. Откуда берутся накладные расходы можно прочесть в уже упомянутом хабратопике.
Однако, даже эти мысли нужно было подтвердить. Для этого понадобился второй тест с изменениями на возможные упомянутые причины столь непредсказуемого (для меня) поведения. Видимо уж очень многое подкрутили в пятой версии (признаюсь, в пятой версии php я проводил только 1 тест: на обход элементов массивов).
Тест номер два.
Вторая гипотеза: удлинение эталонной строки даст, в конечном счете, увеличение процентного отношения времени работы функций-тестировщиков, связанных с формированием строк в двойных кавычках, относительно результатов теста номер 1. Такая же ситуация, теоретически, должна наблюдаться и в отношении работы функции sprintf. Связано это, в первую очередь, с необходимостью парсинга строк и увеличением времени, затраченных на это. В ситуации с конкатенацией подстрок в одинарных кавычках, думаю, будет наблюдаться примерно тот же результат, что и в первом тесте, что даст небольшое уменьшение доли времени выполнения функции quotes_3() ко времени работы всего скрипта (но никак не прирост производительности).
Исходники скрипта лежат здесь,
Копии скриншота можно найти тут, тут и тут.
Выводы, собственно только положительные и подтверждающие гипотезу. При незначительном увеличении эталонной строки появляется большая нагрузка, что приводит к падению быстродействия функций работы с двойными кавычками и sprintf.
Предположение относительно строк в одинарных кавычках так же оказалось верным: вместо 36,75% времени в первом тесте, во втором функция quotes_3() заняла 33,76% времени исполнения скрипта
Практическая ценность.
Говоря простым языком, абстрагируясь от данных, можно сделать вывод: чем длиннее строка, в которой необходимо произвести подстановку, тем больше вероятность, что операция-конкатенация выполнится быстрее, чем поиск переменной в двойных кавычках. Добровольцы могут попробовать подобрать необходимые параметры вставки (количество переменных, длина эталонной строки, длины строк в переменных) такими, чтобы они удовлетворяли равенству времен выполнения.
Вот, собственно, и все. Остается только добавить, что в программировании мелочей не бывает (это я любителям сказать «экономия на спичках» (с) Adelf ). Зная такие тонкости и принимая их во внимание, можно писать код, который будет оптимизирован на всех своих уровнях 😉
PS:
Тесты проведены с помощью Zend Studio For Eclipse 6.0.0 (Debugger + Profiler included).
Версия PHP 5.2.5
ОС Debian Linux
PPS:
Буду рад, если кто-то выложит свои результаты данных тестов. Думаю, это позволит более объективно составить оценку необходимости использования того либо иного метода подстановки в строки. Так же буду признателен здоровой критике стиля изложения и оформления.
Всем спасибо за внимание 🙂
Типы данных в PHP
#php #coding #learning #courses #types
28549
23
Всем привет! Сегодня поговорим о типах данных в PHP. Говоря о типах, мы подразумеваем типы каких-либо значений.
В сравнении с другими языками программирования, (например, C/C++/Java), в PHP одной и той же переменной можно присваивать значения разных типов. Поэтому в PHP типы следует относить не к переменной, а к значению. И говорить, например, что в переменной $var находится значение типа integer. Это называется «динамическая типизация» – одна и та же переменная может хранить значения разных типов. Согласитесь, это очень круто.
Давайте рассмотрим следующий код:
<?php $var = 123; $var = 'string'; $var = 3.14;
Здесь переменная $var на каждой строке меняет своё значение, при этом у этих значений разные типы. В первом случае – целое число (integer), во втором – строка (string), в третьем – дробное число (float).
Онлайн тесты
- Тест на знание основ HTML
- Тест на знание основ PHP
- Тест на знание ООП в PHP
Все тесты
Строки могут быть определены с помощью двойных или одинарных кавычек. Но при этом есть разница – в двойных кавычках интерпретатор будет пытаться найти переменные, а внутри одинарных кавычек – нет.
Пример:
<?php $var = 123; echo "Значение переменной: $var";
Этот код выведет на экран строку:
Значение переменной: 123
Алгоритмические задачи
- Привет, мир!
- Развернуть строку
- Чётные числа
- Числа Фибоначчи
Все задачи
И другой пример:
<?php $var = 123; echo 'Значение переменной: $var';
Выведет следующее:
Значение переменной: $var
Как мы видим, внутри одинарных кавычек не был выполнен поиск переменных и интерпретатор вернул нам текст ровно так, как он был определён.
Чтобы вывести значение переменной и при этом использовать одинарные кавычки, можно склеить строки. Этот приём называется конкатенацией строк (от англ.
<?php $var = 123; echo 'Значение переменной: ' . $var;
Выведет строку:
Значение переменной: 123
Алгоритмические задачи
- Привет, мир!
- Развернуть строку
- Чётные числа
- Числа Фибоначчи
Все задачи
Стоит отметить, что при использовании одинарных кавычек работа со строками будет происходить быстрее, так как не будет происходить поиск (или правильнее сказать парсинг) переменных внутри строки.
Давайте теперь рассмотрим код, похожий на тот, что мы только что написали:
<?php $var = 123; $string = 'Значение переменной: ' . $var;
В переменной $string сейчас хранится значение типа «строка». Несмотря на то, что до этого в $var было целое число. Это произошло в результате использования оператора «точка» для конкатенации строк. В результате его использования всегда получится строка. И, как Вы уже, наверное, догадались, тип, который получится в результате какого-либо выражения, будет зависеть от оператора. То есть, при использовании плюса (оператора сложения), всегда будет получаться число.
Пример:
<?php $x = 1; echo $x + '2';
Выведет результат:
3
PHP достаточно умён, чтобы автоматически преобразовать строку ‘2’ к числу и выполнить сложение. Таким образом, в зависимости от оператора, операнды будут сначала приведены к нужному типу, а затем над ними будет выполнена операция. Это называется «приведение типов«.
Приведение типа можно сделать и самостоятельно. Делается это с помощью следующей конструкции:
(тип_к_которому_нужно_привести) значение
Например:
<?php $string = '123'; $numeric = (int) $string;
В переменной $string сейчас строка, а в переменной $numeric – уже целое число. Пока что не будем на этом детально останавливаться, но знать, что это возможно, лишним не будет.
Давайте теперь пробежимся по типам, которые мы уже рассмотрели. Это числа (целые и дробные), строки. Помимо этих есть ещё несколько типов данных. Все мы их рассматривать сейчас не будем, но рассмотрим ещё один простейший тип – boolean (булево значение). У этого типа могут быть только два значения: true и false – «истина» и «ложь» (надеюсь, информатика у всех в школе была?). Этот тип используется для проверки различных условий и в следующем уроке мы рассмотрим его применение более детально. Это всё, что касается типов.
#php #coding #learning #courses #types
28549
23
Смешивание переменной PHP со строковым литералом
Задавать вопрос
спросил
Изменено 2 года, 8 месяцев назад
Просмотрено 216 тысяч раз
167
Новинка! Сохраняйте вопросы или ответы и организуйте свой любимый контент.
Узнать больше.
Скажем, у меня есть переменная $test
, и она определена как: $test = 'сыр'
Я хочу вывести cheesey
, что я могу сделать следующим образом:
echo $test . 'у'
Но я бы предпочел упростить код примерно так (что не сработает):
echo "$testy"
Есть ли способ получить и
рассматриваться как отдельный от переменной?
- php
- строка
- переменные
1
эхо "{$test}y";
Можно использовать фигурные скобки для устранения неоднозначности при интерполяции переменных непосредственно в строках.
Кроме того, это не работает с одинарными кавычками. Итак:
echo '{$test}y';
выведет
{$test}y
3
Вы можете использовать {}
вокруг вашей переменной, чтобы отделить ее от того, что после:
echo "{$test}y"
В качестве справки вы можете обратиться к разделу Анализ переменных — сложный (фигурный) синтаксис руководства по PHP.
3
Пример:
$test = "сыры"; "${тест}г";
Будет выведено:
сырный
Это именно то, что вы ищете.
$bucket = '$node->' . $имя поля. "['und'][0]['value'] = " . '$form_state' . "['ценности']['" . $имя поля. "']"; напечатать $ведро;
дает:
$node->mindd_2_study_status['und'][0]['value'] = $form_state['values'] ['mindd_2_study_status']
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Операторы PHP Echo и Print
❮ Предыдущий Далее ❯
В PHP существует два основных способа получения вывода: echo
и print
.
В этом уроке мы используем эхо
или печатать
почти в каждом
пример. Итак, эта глава содержит немного больше информации об этих двух выходных
заявления.
Операторы PHP echo и print
echo
и print
более или менее одинаковы. Они оба используются для вывода данных
на экран.
Различия небольшие: echo
не имеет возвращаемого значения, а print
имеет возвращаемое значение 1, поэтому его можно использовать в
выражения. echo
может принимать несколько параметров (хотя такое использование редко)
в то время как print
может принимать один аргумент. эхо
незначительно
быстрее, чем печатать
.
Оператор PHP echo
Оператор echo
может использоваться со скобками или без них: эхо
или эхо()
.
Текст на дисплее
В следующем примере показано, как вывести текст с помощью эха
команда (обратите внимание, что текст может содержать разметку HTML):
Пример
echo «
PHP — это весело!
«;echo «Привет, мир!
«;
echo «Я собираюсь изучать PHP!
«;
echo «Это», «строка», «было», «сделано», «с несколькими параметрами. «;
?>
Попробуйте сами »
Отображение переменных
В следующем примере показано, как выводить текст и переменные с помощью эха
выписка:
Пример
$txt1 = «Изучайте PHP»;
$txt2 = «W3Schools.com»;
$х = 5;
$у = 4;
эхо »
» . $txt1 . «
«;echo «Изучайте PHP в » . $txt2 . «
«;
echo $x + $y;
?>
Попробуйте сами »
Оператор печати PHP
Оператор печати
может использоваться с или без
скобки: напечатать
или напечатать()
.
Отображение текста
В следующем примере показано, как вывести текст с помощью печати
команда (обратите внимание, что текст может содержать разметку HTML):
Пример
print «
PHP — это весело!
«;print «Привет, мир!
«;
print «Я собираюсь изучать PHP!»;
?>
Попробуйте сами »
Отображение переменных
В следующем примере показано, как вывести текст и переменные с помощью печать
выписка:
Пример
$txt1 = «Изучайте PHP»;
$txt2 = «W3Schools. com»;
$х = 5;
$у = 4;
напечатать »
» . $txt1 . «
«;print «Изучайте PHP в» . $txt2 . «
«;
напечатать $x + $y;
?>
Попробуйте сами »
❮ Предыдущий Далее ❯
НОВИНКА
Мы только что запустили
Видео W3Schools
Узнать
ВЫБОР ЦВЕТА
КОД ИГРЫ
Играть в игру
Лучшие учебники
Учебник по HTMLУчебник по CSS
Учебник по JavaScript
Учебник How To
Учебник по SQL
Учебник по Python
Учебник по W3.CSS
Учебник по Bootstrap
Учебник по PHP
Учебник по Java
Учебник по C++
Учебник по jQuery
Лучшие ссылки
HTML ReferenceCSS Reference
JavaScript Reference
SQL Reference
Python Reference
W3.CSS Reference
Bootstrap Reference
PHP Reference
HTML Colors
Java Reference
Angular Reference
jQuery Reference
2 Top96 Examples
Примеры HTML
Примеры CSS
Примеры JavaScript
Примеры How To
Примеры SQL
Примеры Python
Примеры W3.