Php підстановка змінних у рядок. Використання шаблонів у PHP. Обробка змінних у рядках

PHP, в даний час, – одна з найпопулярніших мов для реалізації веб-додатків. Цей курс присвячений вивченню його основ. Акцент робиться на практичне застосування здобутих навичок.

Мова PHP була створена для вирішення конкретного практичного завдання в середовищі інтернет (який саме можна дізнатися, прочитавши першу лекцію курсу). Ми теж постараємося не відволікатися надто сильно на теоретичні міркування, і будемо прагнути вирішення якогось конкретного завдання в кожній з лекцій. Більшість прикладів взято із реально існуючої системи: віртуального музею історії інформатики. Перша частина курсу присвячена вивченню основ синтаксису та керуючих конструкцій. Після цього розглядається технологія клієнт-сервер як основна сфера застосування мови PHP. Потім переходимо до вивчення найбільш корисних на наш погляд вбудованих функцій та вирішення за їх допомогою практичних завдань. Хоча об'єктна модель у мові PHP не найбагатша, її важлива наявність дозволяє природним чином описувати об'єктні моделі даних. Як базова модель буде розглянута модель документа віртуального музею інформатики. Після цього буде розглянуто ряд прикладних аспектів: робота з файловою системою, БД, рядками, сесіями, DOM XML - все це дозволить розглянути ключові завдання практичного використання мови.

Книга:

Використання шаблонів у PHP

Використання шаблонів у PHP

Що таке шаблони і навіщо вони потрібні

Що таке шаблон мови програмування? Можна сказати, що шаблон - це текст із змінними всередині нього. Під час обробки шаблону відбувається заміна змінних з їхньої значення.

В одній із лекцій ми вже розглядали приклад шаблону. Це був шаблон відображення документів. Користувач створював рядок тексту, розміченого за допомогою html-тегів, та вставляв у нього спеціальні метасимволи (виду), які наша програма згодом замінювала значення відповідних елементів. Навіщо нам був потрібен такий шаблон? Щоб, наприклад, можна змінити стиль відображення документа, не змінюючи коду програми.

Найбільш поширена відповідь на питання, навіщо потрібні шаблони, звучить приблизно так: шаблони потрібні для того, щоб відокремити логіку роботи програми від способу представлення даних, тобто від дизайну.

Наведений приклад шаблону - один із найпростіших. Для його обробки використовується лише функція підстановки str_replace(). Найчастіше для того, щоб працювати із шаблонами, створюють бібліотеки класів. У принципі створювати свою бібліотеку не обов'язково, оскільки існує безліч бібліотек шаблонів, що вільно розповсюджуються, над функціональністю яких працюють великі колективи розробників, намагаючись зробити їх універсальними, потужними і швидкими. Деякі з таких бібліотек ми розглянемо. Але для початку сформулюємо завдання, на прикладі вирішення якого демонструватимемо використання різних шаблонів.

Отже, завдання:

Потрібно згенерувати веб-сторінку зі списком статей, що є у базі даних. Для простоти вважаємо, що стаття має назву title, автора author, короткий зміст abstract і повний зміст fulltext, який представлений або у вигляді тексту в базі даних, або у вигляді посилання на файл. Список повинен бути організований так, щоб при натисканні мишею на назві статті її повний зміст з'являвся в новому вікні.

Шаблони підстановки

Як можна розв'язати таке завдання методом простий підстановки, тобто. тим методом, яким вирішили завдання відображення документів?

Потрібно вигадати шаблон для цієї сторінки і десь його зберігати (у файлі або в базі даних). Очевидно, що ми не можемо вигадати шаблон для всієї сторінки, тому що не знаємо, скільки статей у базі даних. У шаблоні ми домовилися використовувати тільки html і метасимволи. Тому ми можемо написати лише шаблон для одного рядка списку, який вже програмно треба перетворити на потрібну кількість рядків.

  • "
    target=new>
    ()

    Крім того, тут є ще одна проблема - з відображенням посилання на повний текст статті. Якщо ми діятимемо за правилом підстановки (міняти всі метасимволи на їх значення з бази даних), то може вийти, що замістьвставимо не посилання текст, а сам текст. Тобто для цього елемента потрібна додаткова перевірка перед заміною і якісь додаткові дії у випадку, якщо поле fulltext містить текст статті, а не посилання на файл. Не будемо ускладнювати собі життя і домовимося, що в полі fulltext завжди міститься лише посилання на файл. Тоді завдання можна вирішити так:

    $li_tmpl = file_get_contents("tmpl.html");
    // зчитуємо шаблон рядка з файлу
    // встановлюємо з'єднання та вибираємо
    // базу даних
    $conn = mysql_connect("localhost",
    "nina", "123")
    or die("Cant connect");
    mysql_select_db("book");
    $sql = "SELECT * FROM Articles";
    $q = mysql_query($sql,$conn);
    // надсилаємо запит
    $num = mysql_num_rows($q);
    for($i=0; $i<$num; $i++){
    $tmpl. = $li_tmpl;
    $tmpl = str_replace("",
    mysql_result($q,$i,"title"),$tmpl);
    $tmpl = str_replace("",
    mysql_result($q,$i,"author"),$tmpl);
    $tmpl = str_replace("",
    mysql_result($q,$i,"abstract"),$tmpl);
    $tmpl = str_replace("",
    mysql_result($q,$i,"fulltext"),$tmpl);
    }
    echo $tmpl;
    ?>

    Якщо шаблон був такий, як наведено вище, отримаємо приблизно наступне.

    Введення в PHP(Савельєва Н.В.)

    Лекція дає уявлення про те, що таке мова PHP, для чого вона створювалася спочатку і як використовується тепер, якими можливостями володіє.

    Встановлення та налаштування ПЗ(Іванов Іван)

    У принципі, метод досить простий і зручний, але вимагає додаткових зусиль програміста при виникненні задач більш складних, ніж проста підстановка значень. Для вирішення завдань, де потрібно робити підстановку цілих блоків або навіть перевіряти умови, створюють класи шаблонів, такі як FastTemplate та Smarty. Обговоримо їх докладніше.

    Шаблони FastTemplate

    FastTemplate – це набір класів, що дозволяють реалізувати роботу із шаблонами. Логіку додати до шаблону FastTemplate не можна, вся вона повинна знаходитись у коді програми. Ідея роботи шаблонів FastTemplate полягає в тому, що будь-яка велика сторінка складається з безлічі шматочків, найменші з яких - звичайні рядки тексту, і вони отримують ім'я та значення.

    Що таке файл шаблону FastTemplate? Це звичайний html-файл, в якому можуть зустрічатися змінні особливого виду, які згодом обробляються методами класу FastTemplate.

    Синтаксис змінних у шаблонах FastTemplate описується так: ((+))

    Це означає, що змінна повинна починатися з фігурної дужки "(". Другий і наступні символи повинні бути літерами верхнього регістру від A до Z, цифрами або символами підкреслення. Змінна обчислюється за допомогою фігурної дужки "), що закриває.

    (TITLE)
    (AUTH20)
    (TOP_OF_PAGE)

    Як було зазначено, основна ідея FastTemplate - створення сторінки з допомогою вкладених шаблонів. Наприклад, для вирішення нашого завдання можна створити три файли шаблону:


    (TITLE_)


    (MAIN)



      (LIST_ELEMENT)

  • (TITLE)
    ((AUTHOR))

    (ABSTRACT)

    Шаблони ми створили – роботу дизайнера виконали. Тепер необхідно навчитися їх обробляти, тобто. виконати роботу програміста. Зараз створимо програму для обробки наведених вище шаблонів.

    Перед початком роботи із шаблонами FastTemplate необхідно підключити цей набір класів до нашої програми. У реальному житті набір класів FastTemplate записаний в один файл, як правило, під назвою class.FastTemplate.php3, тому підключити його можна, наприклад, за допомогою команди:

    include("class.FastTemplate.php3");

    Наступний важливий крок - це створення об'єкта класу FastTemplate, з яким згодом ми працюватимемо:

    $tpl = New FastTemplate(
    "/path/to/templates");

    Як параметр передається шлях до місця, де знаходяться наші шаблони.

    Для роботи з FastTemplate потрібно знати чотири основні методи: define, assign, parse і FastPrint.

    Метод define

    Синтаксис:

    define(array (ключ => значення,
    ключ1 => значення1, ...))

    Метод define() пов'язує ім'я файлу шаблону з коротким ім'ям, яке можна використовувати у програмі. Тобто "ключ" - це ім'я, яке ми будемо використовувати у програмі посилання на файл шаблону, ім'я якого записано в рядку "значення". Реальні імена файлів шаблонів не рекомендується використовувати ніде, за винятком методу define. Під час виклику методу define() відбувається завантаження всіх певних шаблонів.

    $tpl->define(array (main => "main.tpl",
    list_f => "list.tpl",
    list_el=>"list_element.tpl"));

    Тут ми задаємо псевдоніми імен файлів шаблонів. Ці псевдоніми, тобто. змінні main, list_f та list_el, будуть використовуватись у програмі замість відповідних імен файлів main.tpl, list.tpl та list_element.tpl.

    Метод assign

    Синтаксис:

    assign((пари ключ/значення) або
    (array(пари ключ/значення))

    Метод assign() надає змінним значення, "ключ" - це ім'я змінної, а "значення" - значення, яке їй потрібно присвоїти. Щоб змінна в шаблоні була замінена значенням, це потрібно задати їй за допомогою методу assign(). Відповідно до синтаксису цей метод можна використовувати у двох різних формах. У FastTemplate є лише один масив, тому, якщо ви повторно задаєте значення одному й тому самому ключу, воно буде перезаписано.

    $tpl->assign(array(
    TITLE => "Встановлення та налаштування ПЗ",
    TITLE => "Вступ до PHP"));

    Тут двічі встановлюємо значення змінної, доступної у файлах шаблону на ім'я TITLE. Ця змінна матиме останнє присвоєне їй значення, тобто. вона дорівнює рядку "Вступ до PHP".

    Метод parse

    Синтаксис:

    parse (повертається змінна,
    джерела шаблонів)

    Метод parse() - найголовніший у FastTemplate. Він встановлює значення змінної, що повертається, рівним обробленим шаблонам із зазначених джерел. Метод може використовуватися у трьох формах: простий, складовий та приєднує.

    $tpl->parse(MAIN, "main");
    // проста форма
    $tpl->parse(MAIN, array ("list_f", "main"));
    // Складова форма
    $tpl->parse(MAIN, ".list_el");
    // форма, що приєднує

    У простій формі шаблон із псевдонімом "main" завантажується (якщо ще не був завантажений), всі його змінні підставляються, і результат зберігається як значення змінної MAIN. Якщо змінна (MAIN) з'явиться в пізніших шаблонах, замість неї буде підставлено значення, отримане в результаті обробки шаблону "main". Це дозволяє створювати вкладені шаблони.

    Складова форма методу parse() створена у тому, щоб спростити вкладення шаблонів друг в друга. Наступні записи еквівалентні:

    $tpl->parse(MAIN, "list_f");
    $tpl->parse(MAIN, ".main");

    це те саме що і

    $tpl->parse(MAIN, array("list_f", "main"));

    Коли використовується складова форма, важливо, щоб кожен шаблон, що йде у списку після першого, містив ту змінну, яку передаються результати обробки шаблону. У прикладі вище main повинен містити змінну (MAIN), оскільки в неї передаються результати обробки шаблону list_f. Якщо main не містить змінної (MAIN), результати обробки шаблону list_f будуть втрачені.

    Стиль, що приєднує, дозволяє додавати результати обробки шаблону до змінної результату. Крапка перед псевдонімом файлу шаблону говорить FastTemplate про те, що потрібно приєднати результат обробки цього шаблону до повернених результатів, а не перезаписувати його. Такий стиль найчастіше використовується при побудові таблиць зі змінним числом рядів, які отримують, наприклад, в результаті запиту до бази даних.

    Метод FastPrint

    Синтаксис:

    FastPrint(оброблена змінна)

    Метод FastPrint() друкує вміст переданої до нього обробленої змінної. Якщо він викликаний без параметрів, друкується остання використана методом parse() змінна.

    $tpl->FastPrint();
    /* якщо продовжувати попередній приклад,
    то ця функція надрукує значення
    змінної MAIN */
    $tpl->FastPrint("MAIN");
    // ця функція зробить те саме

    Якщо потрібно друкувати не на екран, а, наприклад, файл, отримати посилання на дані можна за допомогою методу fetch().

    $data = $tpl->fetch("MAIN");
    fwrite($fd, $data); // Запис даних у файл

    Вирішення задачі за допомогою шаблонів FastTemplate

    Тепер спробуємо зібрати докупи всі вивчені методи, щоб вирішити наше завдання.

    Зауважимо, що розв'язання задачі вийшло дещо складнішим, ніж у першому випадку, коли використовувалася лише функція регулярної заміни. Зате тут ми можемо змінювати три різні шаблони (документи загалом, списки та елементи списку).

    Цей клас шаблонів виник ще до виходу PHP4 для роботи з PHP3. Щоб протестувати наведені приклади, потрібно завантажити бібліотеку класів FastTemplate та скопіювати цей файл у свою робочу директорію. Якщо ви працюєте з PHP4, то файл class.FastTemplate.php3 потрібно внести пару змін, про які написано в документації, що поставляється разом з цією бібліотекою.

    Шаблони Smarty

    Smarty – один з діючих проектів PHP, його офіційний сайт – http://smarty.php.net. Там можна завантажити як самий набір класів Smarty, так і документацію до нього. Цей набір класів для обробки шаблонів - набагато потужніший і функціональніший, ніж FastTemplate. Насамперед, він не відокремлює повністю логіку від змісту. Логіка, що стосується відображення даних, може бути у шаблоні, вважають розробники Smarty. Тому у шаблоні Smarty можуть бути умовні оператори, оператори вставки файлів, оператори змінних змін, цикли тощо. Інша особливість Smarty – це компіляція шаблонів. Шаблони переводяться в php-код, і інтерпретатор PHP робить всі необхідні дії щодо встановлення значень. Для прискорення роботи скомпіловані шаблони кешуються.

    Розглянемо деякі основні конструкції механізму шаблонів Smarty.

    Встановлення

    Перше, з чого ми почнемо, це установка Smarty. Тут все не так просто, як із FastTemplate. Smarty складається з одного php-файла з описом класу, та якщо з цілого набору різних файлів-бібліотек. Для того, щоб працювати з шаблонами Smarty, потрібно зробити бібліотеки доступними для всіх ваших програм. Вони знаходяться в каталозі /libs/ дистрибутива Smarty. Файл, де міститься визначення самого класу Smarty, називається Smarty.class.php. Щоб перевірити, чи доступні бібліотеки класу Smarty, потрібно написати такий скрипт:

    require("Smarty.class.php");
    // підключаємо файл з
    // описом класу Smarty
    $ Smarty = New Smarty;
    // створюємо екземпляр класу Smarty
    ?>

    Якщо при його виконанні з'явилася помилка, то потрібно спробувати один із наведених нижче варіантів.

    // підключаємо файл із описом класу
    require("c:/users/my/Smarty/libs/
    Smarty.class.php");
    $ Smarty = New Smarty;
    // створюємо екземпляр класу Smarty
    ?>

    Додати директорію, де містяться бібліотеки, в include_path (у цьому випадку код міняти не потрібно).

    define("SMARTY_DIR",
    "c:/users/my/Smarty/libs/index.html");
    require(SMARTY_DIR."Smarty.class.php");
    $ Smarty = New Smarty;
    ?>

    Тепер, після того, як ми переконалися, що бібліотеки будуть знайдені, потрібно створити директорії, необхідні для роботи Smarty, які за промовчанням мають такі імена:

    Templates - директорія, де ми зберігатимемо створені шаблони;

    Templates_c - директорія, де Smarty зберігатиме скомпіловані шаблони;

    Configs – директорія для зберігання конфігураційних файлів;

    Cache – директорія для кешу.

    Ці імена задаються властивостями $template_dir, $compile_dir, $config_dir, $cache_dir класу Smarty, тому їх можна перевизначити. Рекомендується використовувати різні набори директорій для кожної програми, яка працює із шаблонами Smarty. Доступ до перерахованих директорій здійснюється бібліотекою Smarty і ніколи не виконується безпосередньо через веб-браузер. Тому, щоб уникнути проблем із безпекою, найкраще розмістити ці директорії там, куди немає доступу через www.

    Створимо перелічені Smarty директорії за адресою c:/smarty_dirs/book/. Зауважимо, що прочитати звідси дані через браузер не можна. Нехай наша програма (або програма) знаходиться за адресою /~my/tasks/book/. Для директорій $compile_dir і $cache_dir Smarty потрібний доступ на запис, так що потрібно встановити відповідні їм права для мережного користувача, з яким ваш сервер працює за замовчуванням (зазвичай це www або nobody).

    Щоб протестувати налаштування, створимо простий шаблон і програму, що обробляє його з використанням механізму Smarty.

    index.tpl (є Smarty шаблоном і знаходиться в директорії шаблонів c:/smarty_dirs/book/templates/)

    (* Шаблон Smarty *)
    Привіт ($name)!

    index.php (є кодом нашої програми і знаходиться в директорії /~my/tasks/book/ або, що те саме, в директорії c:/users/my/tasks/book/)

    В результаті мають отримати:

    Привіт Вася!

    Усі налаштування, необхідні для роботи нашої програми, можна винести в окремий файл та організувати їх як розширення класу Smarty.

    Основний синтаксис

    Smarty - не просто клас для обробки шаблонів, він визначає цілу мову побудови шаблонів. Ми торкнемося лише основних його елементів. Отже, що таке шаблон Smarty? Це набір спеціальних конструкцій (змінних, викликів функцій та методів тощо) та html-тегів. Усі елементи (теги) мови шаблонів Smarty укладаються між символами-обмежувачами. За промовчанням це символи фігурних дужок "(" та ")", але їх можна змінити. Все, що не укладено в такі обмежувачі, Smarty розглядає як константи, що не потребують обробки. У шаблоні index.tpl, наведеному вище, ($name) - це змінна, а рядки "Привіт," та "!" - константи, що не змінюються в процесі обробки шаблону.

    Коментарі в Smarty записуються між двома зірочками:

    (* Це коментар. Після обробки шаблону
    він на екрані не відображається *)

    Кожен Smarty тег або виводить значення змінної, або викликає будь-яку функцію. Функція записується так:

    (ім'я_функції атрибут1="значення1"
    атрибут2="значення2")

    Змінні шаблони можуть бути декількох типів:

    Змінні, значення яким надається у php-скрипті користувача, повинні мати перед ім'ям знак долара.

    Наприклад: ($first_name)

    Елементи масиву, значення яких присвоєно в php-скрипті користувача, доступні в шаблоні за допомогою синтаксису ($ім'я_масиву.асоціативний_ключ).

    Наприклад: ($person.last_name)

    Елементи не асоціативного масиву доступні за допомогою синтаксису квадратних дужок: (ім'я_масиву[числовий_індекс])

    Наприклад: ($person)

    Властивості об'єктів, задані в php-скрипті, доступні в шаблоні за допомогою синтаксису: (ім'я_об'єкта->ім'я_властивості)

    Наприклад: ($person->email)

    Змінні, завантажені з конфігураційних файлів (що це таке, ми розповімо трохи пізніше) укладаються між символами #. Також вони є елементами асоціативного масиву $smarty.config.

    Наприклад: (#bodyBgColor#) або ($smarty.config.bodyBgColor)

    Крім того, існує змінна ($smarty), зарезервована для деяких спеціальних змінних шаблону, таких як змінні HTTP запиту, дати та часу тощо.

    У шаблонах Smarty визначено ряд модифікаторів, які можна застосовувати до змінних, функцій користувача або рядків для того, щоб модифікувати їх значення. Щоб застосувати модифікатор, потрібно вказати його назву після вертикальної риси, яка слідує за ім'ям змінної, функції або рядком, до якого він застосовується.

    Наприклад, щоб перевести значення змінної ($title) у верхній регістр, потрібно застосувати модифікатор upper, тобто. написати наступне: ($title|upper)

    Можна використовувати відразу кілька модифікаторів, відокремлюючи їх один від одного прямою вертикальною межею. Наприклад, ($title|upper|truncate) переведе значення змінної у верхній регістр і уріже до 80 символів.

    Перераховувати всі модифікатори ми не будемо. Їх список можна знайти у документації Smarty. Скажімо лише, що з їхньою допомогою можна порахувати число символів, слів і параграфів, дописати рядок, задати формат виведення дати та часу, зробити регулярну заміну та багато іншого.

    Конфігураційні файли

    Конфігураційні файли використовуються для того, щоб керувати глобальними змінними, які використовуються у шаблоні, за допомогою одного файлу. Їхня ідея дуже схожа на таблиці стилів css. Конфігураційний файл містить набір змінних та його значення. Перед іменем змінної не ставиться додаткових символів типу знака долара. Значення змінної за бажанням укладають у лапки (подвійні або одинарні), якщо воно складається з декількох рядків, його укладають у потрійні лапки.

    # глобальні змінні
    pageTitle = "(!LANG:List of documents"!}
    bodyBgColor = #000000
    tableBgColor = #000000
    rowBgColor = #00ff00
    pageTitle = "(!LANG:Список статей"!}
    Intro = """Це значення складається з
    кількох рядків. Тому його потрібно
    укласти в потрійні лапки."""
    # прихована секція
    [.Database]
    host=localhost
    db=book
    user=nina
    pass=123

    Конфігураційний файл може складатися з кількох розділів (секцій), кожна з яких має ім'я та може завантажуватися окремо від решти секцій. Ім'я секції полягає у квадратних дужках. Крім секцій у конфігураційному файлі можуть бути глобальні змінні - вони не входять в жодну секцію і завжди завантажуються при завантаженні конфігураційного файлу. Якщо завантажується якась одна секція, завантажуються її змінні і глобальні змінні. Якщо змінна існує як глобальна змінна, як і змінна секції, то використовується змінна секції. Якщо ви однаково назвете дві змінні всередині однієї секції, то використовуватиметься остання. У наведеному вище прикладі дві секції - Customer і Database, крім них задані глобальні змінні pageTitle, bodyBgColor, tableBgColor і rowBgColor.

    Щоб сховати значення змінної або секцію, потрібно перед її ім'ям поставити крапку. У такому разі під час завантаження конфігураційного файлу ці дані не можна буде прочитати. У прикладі ми зробили прихованою секцію Database, щоб не можна було дізнатися пароль та ім'я користувача, які застосовуються для встановлення з'єднання.

    (PHP 4, PHP 5, PHP 7)

    str_replace - Замінює всі входи рядка пошуку на рядок заміни

    Опис

    Ця функція повертає рядок або масив, де всі входження search в subject замінені на replace .

    Якщо не потрібні складні правила пошуку/заміни (наприклад, регулярні вирази), використання цієї функції краще preg_replace().

    Список параметрів

    Якщо search і replace - масиви, то str_replace()використовує кожне значення з відповідного масиву для пошуку та заміни в subject. Якщо в масиві replace менше елементів, ніж у search , як рядок заміни для значень, що залишилися, буде використаний порожній рядок. Якщо search - масив, а replace - рядок, то цей рядок заміни буде використаний для кожного елемента масиву search . Зворотний випадок не має сенсу.

    Якщо search чи replace є масивами, їх елементи будуть оброблені від першого до останнього.

    Шукане значення, також відоме як needle(голка). Для безлічі значень, що шукаються, можна використовувати масив.

    Replace

    Значення заміни буде використано для заміни значень значень search . Для багатьох значень можна використовувати масив.

    Subject

    Рядок або масив, в якому проводиться пошук і заміна, також відомий як haystack(Стіг сіна).

    Якщо subject є масивом, то пошук із заміною буде здійснюватися над кожним елементом subject , а результатом функції буде масив.

    Якщо передано, то буде встановлено кількість проведених замін.

    Значення, що повертаються

    Ця функція повертає рядок або масив із заміненими значеннями.

    Приклади

    Приклад #1 Приклади використання str_replace()

    // привласнює
    $bodytag = str_replace ("%body%" , "black" , " " );

    // надає: Hll Wrld f PHP
    $vowels = array("a" , "e" , "i" , "o" , "u" , "A" , "E" , "I" , "O" , "U" );
    $onlyconsonants = str_replace ($vowels , "" , "Hello World of PHP" );

    // привласнює: You should eat pizza, beer, and ice cream every day
    $phrase = "You should eat fruits, vegetables, і fiber every day.";
    $ healthy = array("fruits", "vegetables", "fiber");
    $ yummy = array("pizza", "beer", "ice cream");

    $newphrase = str_replace ($healthy, $yummy, $phrase);

    // Надає: 2
    $str = str_replace ("ll", "", "good golly miss molly!", $count);
    echo $count;
    ?>

    Приклад #2 Приклади потенційних трюків з str_replace()

    // Порядок заміни
    $str = "Рядок 1 Рядок 2 Рядок 3 Рядок 4 n";
    $order = array("\r\n", "\n", "\r");
    $replace = "
    " ;

    // Обробляє спочатку \r\n щоб уникнути їх повторної заміни.
    echo $newstr = str_replace ($order, $replace, $str);

    // Виводить F, т.к. A замінюється на B, потім B на C, і так далі.
    // У результаті E буде замінено F, оскільки заміна відбувається зліва направо.
    $search = array("A", "B", "C", "D", "E");
    $replace = array("B", "C", "D", "E", "F");
    $subject = "A";
    echo str_replace ($search, $replace, $subject);

    // Виводить: яблукокорих горіх (з вищевказаної причини)
    $letters = array("я", "про");
    $fruit = array("яблуко", "горіх");
    $text = "я про";
    $output = str_replace ($letters, $fruit, $text);
    echo $output;
    ?>

    Примітки

    Зауваження: Ця функція є безпечною для обробки даних у двійковій формі.

    Застереження

    Зауваження щодо порядку заміни

    Так як str_replace()здійснює заміну ліворуч, то при використанні множинних замін вона може замінити раніше вставлене значення на інше. Дивіться приклади на цій сторінці.

    Зауваження:

    Ця функція чутлива до регістру. Використовуйте str_ireplace()для заміни, нечутливої ​​до регістру.

    Зауваження: У PHP 7.0.0 на 64-бітних платформах немає будь-яких досяжних обмежень для довжини рядка, в 32-бітних системах і ранніх версіях PHP, рядки не можуть бути більше 2 ГБ (2147483647 байт).

    Синтаксис

    Рядок може бути визначений чотирма різними способами:

    • одинарними лапками
    • подвійними лапками
    • nowdoc-синтаксисом (починаючи з PHP 5.3.0)

    Одинарні лапки

    Найпростіший спосіб визначити рядок - це укласти її в одинарні лапки (символ " ).

    Щоб використовувати одинарну лапку всередині рядка, проекрануйте її зворотним слішем ( \ ). Якщо необхідно написати сам зворотний сліш, продублюйте його ( \\ ). Всі інші випадки застосування зворотного сліша будуть інтерпретовані як звичайні символи: це означає, що якщо ви спробуєте використовувати інші послідовності, що управляють, такі як \rабо \n, вони будуть виведені так, як є замість будь-якої особливої ​​поведінки.

    echo "це простий рядок";

    echo "Також ви можете вставляти в рядки
    символ нового рядка ось так,
    це нормально"
    ;

    // Виводить: Якось Арнольд сказав: "I"ll be back"
    echo "Одного разу Арнольд сказав: "I'll be back"";

    Echo "Ви видалили C:\\*.*?";

    // Виводить: Ви видалили C:\*.*?
    echo "Ви видалили C:\*.*?" ;

    // Виводить: Це не буде розгорнуто: новий рядок
    echo "Це не буде розгорнуто: новий рядок";

    // Виводить: Змінні $expand також $either не розвертаються
    echo "Змінні $expand також $either не розвертаються";
    ?>

    Подвійні лапки

    Якщо рядок укладено в подвійні лапки ("), PHP розпізнає наступні послідовності спеціальних символів:

    Керуючі послідовності
    Послідовність Значення
    \n новий рядок (LF або 0x0A (10) в ASCII)
    \r повернення каретки (CR або 0x0D (13) до ASCII)
    \t горизонтальна табуляція (HT або 0x09 (9) ASCII)
    \v вертикальна табуляція (VT або 0x0B (11) ASCII) (з PHP 5.2.5)
    \e escape-знак (ESC або 0x1B (27) в ASCII) (з PHP 5.4.4)
    \f подача сторінки (FF або 0x0C (12) до ASCII) (з PHP 5.2.5)
    \\ зворотна коса риса
    \$ знак долара
    \" подвійна лапка
    \{1,3} послідовність символів, що відповідає регулярному виразу символу у восьмеричній системі числення, який мовчки переповнюється, щоб поміститися в байт (тобто "\400" === "\000")
    \x(1,2) послідовність символів, що відповідає регулярному виразу символу в шістнадцятковій системі числення
    \u(+) послідовність символів, що відповідає регулярному виразу символу Unicode, яка відображається в рядок у поданні UTF-8 (додано в PHP 7.0.0)

    Як і в рядку, укладеному в одинарні лапки, екранування будь-якого символу виведе також і сам екранування. До версії PHP 5.1.1, зворотний слєш в \($var)не друкувався.

    Heredoc

    Третій спосіб визначення рядків - це використання heredoc-синтаксису: <<< . Після цього оператора необхідно вказати ідентифікатор, потім переведення рядка. Після цього йде сам рядок, а потім той самий ідентифікатор, що закриває вставку.

    Рядок повиннапочинатися із закриває ідентифікатора, тобто. він повинен стояти у першому стовпчику рядка. Крім того, ідентифікатор повинен відповідати тим же правилам іменування, що й інші мітки в PHP: містити тільки буквено-цифрові символи і знак підкреслення, і не повинен починатися з цифри (знак підкреслення дозволяється).

    Увага

    Дуже важливо відзначити, що рядок з ідентифікатором, що закриває, не повинен містити інших символів, за винятком точки з комою ( ; ). Це означає, що ідентифікатор не повинен вводитися з відступомі що не може бути жодних пробілів або знаків табуляції до або після крапки з комою. Важливо також розуміти, що першим символом перед ідентифікатором, що закриває, повинен бути символ нового рядка, визначений у вашій операційній системі. Наприклад, у UNIX системах, включаючи macOS, це \n. Після закриває ідентифікатора також одразу має починатися новий рядок.

    Якщо це правило порушено та закриває ідентифікатор не є "чистим", вважається, що закриваючий ідентифікатор відсутній і PHP продовжить його пошук далі. Якщо в цьому випадку вірний закриваючий ідентифікатор так і не буде знайдено, це викликає помилку парсингу з номером рядка в кінці скрипта.

    Приклад #1 Приклад неправильного синтаксису

    class foo (
    public $bar =<<bar
    EOT;
    // відступ перед ідентифікатором, що закриває, неприпустимий
    }
    ?>

    Приклад #2 Приклад правильного синтаксису

    class foo (
    public $bar =<<bar
    EOT;
    }
    ?>

    Heredoc не можна використовувати для ініціалізації полів класу. Починаючи з версії PHP 5.3, це обмеження поширюється тільки на heredoc, що містять у собі змінні.

    Heredoc-текст поводиться так само, як і рядок у подвійних лапках, при цьому їх не маючи. Це означає, що вам немає необхідності екранувати лапки в heredoc, але ви, як і раніше, можете використовувати вищезгадані керуючі послідовності. Змінні обробляються, але із застосуванням складних змінних всередині цьогодокумента потрібно бути також уважним, як і при роботі з рядками.

    Приклад #3 Приклад визначення heredoc-рядка

    $str =<<Приклад рядка,
    що охоплює кілька рядків,
    з використанням heredoc-синтаксису.
    EOD;

    Class foo
    {
    var $foo;
    var $bar;

    Function __construct()
    {
    $this -> foo = "Foo";
    $this ->
    }
    }

    $ foo = new foo ();
    $name = "Іммерек" ;

    echo<<Мене звуть "$name". Я друкую $foo -> foo .
    Тепер я виводжу
    ( $foo -> bar [ 1 ]) .
    Це має вивести велику літеру "A": \x41
    EOT;
    ?>

    Мене звуть "Імерек". Я друкую Foo. Тепер я виводжу Bar2. Це має вивести велику літеру "A": A

    Також можна використовувати heredoc-синтаксис для передачі даних через аргументи функції:

    Починаючи з версії 5.3.0, стала можливою інціалізація статичних змінних та властивостей/констант класу за допомогою синтаксису heredoc:

    Приклад #5 Використання heredoc для інціалізації статичних змінних

    // Статичні змінні
    function foo ()
    {
    static $bar =<<Тут нічого нема...
    LABEL;
    }

    // Константи/властивості класу
    class foo
    {
    const BAR =<<Приклад використання константи
    FOOBAR;

    Public $baz =<<Приклад використання поля
    FOOBAR;
    }
    ?>

    Починаючи з PHP 5.3.0, також можна оточувати ідентифікатор Heredoc подвійними лапками:

    Nowdoc

    Nowdoc - це те саме для рядків в одинарних лапках, що й heredoc для рядків у подвійних лапках. Nowdoc схожий на heredoc, але всередині нього не здійснюється жодних підстановок. Ця конструкція є ідеальною для впровадження PHP-коду або інших великих блоків тексту без необхідності його екранування. У цьому він трохи схожий на SGML-конструкцію тим, що повідомляє блок тексту, не призначений для обробки.

    Nowdoc вказується тією ж послідовністю <<< , що використовується в heredoc, але наступний за нею ідентифікатор полягає в одинарних лапках, наприклад, <<<"EOT" . Всі умови, що діють для ідентифікаторів heredoc, також дійсні і для nowdoc, особливо ті, що відносяться до ідентифікатора, що закриває.

    Приклад #7 Приклад використання nowdoc

    echo<<<"EOD"
    Приклад тексту
    займає кілька рядків,
    за допомогою синтаксису nowdoc. Зворотні сліші завжди обробляються буквально,
    наприклад, \\ та \".
    EOD;

    Результат виконання цього прикладу:

    Приклад тексту, який займає кілька рядків, за допомогою синтаксису nowdoc. Зворотні сліші завжди обробляються буквально, наприклад, \ і \".

    Приклад #8 Nowdoc string quoting example with variables

    /* Більш складний приклад із змінними. */
    class foo
    {
    public $foo;
    public $bar;

    Function __construct()
    {
    $this -> foo = "Foo";
    $this -> bar = array("Bar1", "Bar2", "Bar3");
    }
    }

    $ foo = new foo ();
    $name = "Іммерек" ;

    echo<<<"EOT"
    Мене звуть "$name". Я друкую $foo->foo.
    Тепер я друкую ($foo->bar).
    Це не повинно вивести велику "A": \x41
    EOT;
    ?>

    Результат виконання цього прикладу:

    Мене звуть "$name". Я друкую $foo->foo. Тепер я друкую ($foo->bar). Це не повинно вивести велику "A": \x41

    Приклад #9 Приклад використання статичних даних

    class foo (
    public $bar =<<<"EOT"
    bar
    EOT;
    }
    ?>

    Зауваження:

    Підтримка nowdoc була додана до PHP 5.3.0.

    Обробка змінних

    Якщо рядок вказується в подвійних лапках, або за допомогою heredoc, змінні всередині неї обробляються.

    Існує два типи синтаксису: простий та складний. Простий синтаксис більш легкий та зручний. Він дає можливість обробки змінної, значення масиву ( array) або властивості об'єкта ( object) з мінімумом зусиль.

    Складний синтаксис може бути визначений за фігурними дужками, що оточують вираз.

    Простий синтаксис

    Якщо інтерпретатор зустрічає знак долара ( $ ), він захоплює так багато символів, скільки можливо, щоб сформувати правильне ім'я змінної. Якщо ви хочете точно визначити кінець імені, укладайте ім'я змінної у фігурні дужки.

    $ juice = "apple";

    echo "He drank some $juice juice." . PHP_EOL;

    // Некоректно. "s" - вірний символ імені змінної, але змінна має ім'я $juice.
    echo "He drank some juice made of $juices ." ;

    // Коректно. Строго вказано кінець імені змінної за допомогою дужок:
    echo "He drank some juice made of $( juice ) s." ;
    ?>

    Результат виконання цього прикладу:

    He drank some apple juice. He drank some juice made of. He drank some juice made of apples.

    Аналогічно можуть бути оброблені елемент масиву ( array) або властивість об'єкта ( object). В індексах масиву квадратна дужка, що закриває ( ] ) позначає кінець визначення індексу. Для властивостей об'єкта застосовуються самі правила, як і простих змінних.

    Приклад #10 Приклад простого синтаксису

    define ("KOOLAID", "koolaid1");
    $juices = array("apple" , "orange" , "koolaid1" => "purple" );

    echo "He drank some $juices [ 0 ] juice." . PHP_EOL;
    echo "He drank some $juices [ 1 ] juice." . PHP_EOL;
    echo "He drank some $juices [ koolaid1 ] juice." . PHP_EOL;

    class people (
    public $john = "John Smith" ;
    public $jane = "Jane Smith" ;
    public $ robert = "Robert Paulsen";

    Public $smith = "Smith";
    }

    $people = new people();

    echo " $people -> john drank some $juices [ 0 ] juice." . PHP_EOL;
    echo " $people -> john then said hello to $people -> jane ." . PHP_EOL;
    echo " $people -> john "s wife greeted $people -> robert ." . PHP_EOL ;
    echo " $people -> robert greeted the 2 $people -> smiths ." ; // Не спрацює
    ?>

    Результат виконання цього прикладу:

    He drank some apple juice. He drank some orange juice. He drank some purple juice. John Smith drank деякі apple juice. John Smith є саїд hello to Jane Smith. John Smith"s wife greeted Robert Paulsen. Robert Paulsen greeted the two .

    У PHP 7.1.0 додано підтримку негативнихчислових індексів

    Приклад #11 Негативні числові індекси

    $string = "string";
    echo "Символ з індексом -2 дорівнює$string[-2].", PHP_EOL;
    $string[-3] = "o";
    echo "Зміна символу на позиції -3 на "o" дає наступний рядок:$string ." , PHP_EOL ;
    ?>

    Результат виконання цього прикладу:

    Символ із індексом -2 дорівнює n. Зміна символу на позиції -3 на "o" дає наступний рядок: strong

    Для чогось складнішого, використовуйте складний синтаксис.

    Складний (фігурний) синтаксис

    Він називається складним не тому, що важкий у розумінні, а тому, що дозволяє використовувати складні висловлювання.

    Будь-яка скалярна змінна, елемент масиву або властивість об'єкта, що відображається в рядок, може бути представлений у рядку цим синтаксисом. Просто запишіть вираз так само, як і поза рядком, а потім укласти його в { і } . Оскільки { не може бути екранований, цей синтаксис розпізнаватиметься тільки коли $ слід безпосередньо за { . Використовуйте {\$ , щоб надрукувати {$ . Декілька пояснюючих прикладів:

    // Показуємо всі помилки
    error_reporting (E_ALL);

    $ great = "здорово" ;

    // Не працює, виводить: Це (здорово)
    echo "Це ($great)";

    // Працює, виводить: Це здорово
    echo "Це ($great)";

    // Працює
    echo "Цей квадрат шириною( $square -> width ) 00 сантиметрів.";

    // Працює, ключі, укладені в лапки, працюють лише з синтаксисом фігурних дужок
    echo "Це працює: ($ arr ["key"])";

    // Працює
    echo "Це працює: ($ arr [4] [3])";

    // Це не так з тієї ж причини, що і $foo поза
    // Рядки. Іншими словами, це як і раніше буде працювати,
    // але оскільки PHP спочатку шукає константу foo, це викличе
    // Помилка рівня E_NOTICE (невизначена константа).
    echo "Це не правильно:($ arr [foo] [3]) ";

    // Працює. При використанні багатовимірних масивів усередині
    // рядків завжди використовуйте фігурні дужки
    echo "Це працює: ($ arr ["foo"] [3])";

    // Працює.
    echo "Це працює: ". $arr ["foo"] [3];

    echo "Це теж працює:($obj->values[3]->name)";

    echo "Це значення змінної на ім'я$name: ($($name)) ";

    echo "Це значення змінної на ім'я, яке повертає функція getName():($( getName ())) ";

    echo "Це значення змінної на ім'я, яке повертає \$object->getName():($( $object -> getName ())) ";

    // Не працює, виводить: Це те, що повертає getName(): (getName())
    echo "Це те, що повертає getName(): (getName())";
    ?>

    За допомогою цього синтаксису також доступ до властивостей об'єкта всередині рядків.

    class foo (
    var $bar = "I am bar." ;
    }

    $ foo = new foo ();
    $bar = "bar";
    $baz = array("foo", "bar", "baz", "quux");
    echo "($foo -> $bar)\n";
    echo " ($ foo -> ($ baz [1])) \ n";
    ?>

    Результат виконання цього прикладу:

    I am bar. I am bar.

    Зауваження:

    Функції, виклики методів, статичні змінні класів, а також константи класів працює всередині {$} , починаючи з версії PHP 5. Однак, вказане значення буде оброблено як ім'я змінної в тому ж контексті, що рядок, в якій вона визначається. Використання одинарних фігурних дужок ( {} ) не працюватиме для доступу до значень функцій, методів, констант класів або статичних змінних класу.

    // Показуємо всі помилки
    error_reporting (E_ALL);

    class beers (
    const softdrink = "rootbeer";
    public static $ale = "ipa";
    }

    $rootbeer = "A&W";
    $ipa = "Alexander Keith";

    // Це працює, виводить: Я б хотів A & W
    echo "Я хотів би ($( beers :: softdrink )) \n" ;

    // Це теж працює, виводить: Я б хотів Alexander Keith"s
    echo "Я хотів би ($( beers :: $ale )) \n" ;
    ?>

    Доступ до символу в рядку та його зміна

    Символи в рядках можна використовувати і модифікувати, визначивши їх зсув відносно початку рядка, починаючи з нуля, у квадратних дужках після рядка, наприклад $str . Думайте про рядок для цієї мети як про масив символів. Якщо потрібно отримати або замінити понад 1 символ, можна використовувати функції substr()і substr_replace().

    Зауваження: починаючи з PHP 7.1.0 підтримуються негативні значення зсуву. Вони задають усунення з кінця рядка. Раніше негативні усунення викликали помилку рівня E_NOTICEпід час читання (повертаючи порожній рядок) або E_WARNINGпід час запису (залишаючи рядок без змін).

    Зауваження: До символу в рядку можна також звертатися за допомогою фігурних дужок, наприклад, $str(42) .

    Увага

    Спроба запису у зсув за межами рядка доповнить рядок пробілами до цього зміщення. Нецілі типи буде перетворено на цілі. Неправильний тип зміщення викликає помилку рівня E_WARNING. Використовується лише перший символ рядка. Починаючи з PHP 7.1.0, присвоєння порожнього рядка викликає фатальну помилку. Раніше в такому разі надавав нульовий байт (NULL).

    Увага

    Рядки в PHP внутрішньо являють собою масиви байт. Як результат, доступ або зміна рядка зі зміщення небезпечно з точки зору багатобайтного кодування, і має виконуватися лише з рядками в однобайтних кодуваннях, таких як, наприклад, ISO-8859-1.

    Зауваження: Починаючи з PHP 7.1.0, використання порожнього індексу викликає фатальну помилку, раніше в такому разі рядок перетворювався на масив без попередження.

    Приклад #12 Кілька прикладів рядків

    // Отримання першого символу рядка
    $str = "This is a test." ;
    $first = $str[0];

    // Отримання третього символу рядка
    $third = $str[2];

    // Отримання останнього символу рядка
    $str = "This is still a test." ;
    $last = $str [strlen ($str) - 1];

    // Зміна останнього символу рядка
    $str = "Look at the sea" ;
    $str [strlen ($str) - 1] = "e";

    ?>

    Починаючи з PHP 5.4, зсув у рядку повинен задаватися або цілим числом, або рядком, що містить цифри, інакше буде видаватися попередження. Раніше зсув, заданий рядком виду "foo", без попереджень перетворювалося на 0 .

    Приклад #13 Відмінності між PHP 5.3 та PHP 5.4

    $str = "abc";

    Var_dump ($str ["1"]);
    var_dump (isset($str ["1"]));

    Var_dump ($str ["1.0"]);
    var_dump (isset($str ["1.0"]));

    Var_dump ($str["x"]);
    var_dump (isset($str["x"]));

    Var_dump ($str ["1x"]);
    var_dump (isset($str ["1x"]));
    ?>

    Результат виконання цього прикладу в PHP 5.3:

    string(1) "b" bool(true) string(1) "b" bool(true) string(1) "a" bool(true) string(1) "b" bool(true)

    Результат виконання цього прикладу в PHP 5.4:

    string(1) "b" bool(true) Warning: Illegal string offset "1.0" в /tmp/t.php on line 7 string(1) "b" bool(false) Warning: Illegal string offset "x" in / tmp/t.php on line 9 string(1) "a" bool(false) string(1) "b" bool(false)

    Зауваження:

    Спроба доступу до змінних інших типів (за винятком масивів або об'єктів, що реалізують певні інтерфейси) за допомогою або {} мовчки поверне NULL.

    Зауваження:

    У PHP 5.5 було додано підтримку доступу до символів у рядкових літералах за допомогою синтаксису або {} .

    Для модифікації рядків існує багато корисних функцій.

    Основні функції описані в розділі рядкових функцій, а для розширеного пошуку та заміни - функції Perl-сумісних регулярних виразів.

    Перетворення на рядок

    Значення може бути перетворено на рядок за допомогою приведення (string), або функції strval(). У виразах, де потрібний рядок, перетворення відбувається автоматично. Це відбувається, коли ви використовуєте функції echoабо printабо коли значення змінної порівнюється з рядком. Прочитання розділів керівництва Типи та Маніпуляції з типами зробить таке зрозуміліше. Дивіться також settype().

    Масиви завжди перетворюються на рядок "Array", так що ви не можете відобразити вміст масиву ( array), використовуючи echoабо print, щоб дізнатися, що він містить. Щоб переглянути окремий елемент, використовуйте щось на зразок echo $arr["foo"]. Дивіться нижче поради щодо того, як відобразити/переглянути весь вміст.

    Для перетворення змінної типу "Object"у тип stringвикористовується магічний метод __toString.

    Значення NULLзавжди перетворюється на порожній рядок.

    Як ви могли бачити вище, пряме перетворення в рядок масивів, об'єктів або ресурсів не дає жодної корисної інформації про значення, крім їх типів. Найкращий спосіб виведення значень для налагодження - використовувати функції print_r()і var_dump().

    Більшість значень у PHP може бути перетворена на рядок для постійного зберігання. Цей метод називається серіалізацією і може бути виконаний за допомогою функції serialize().

    Перетворення рядків у числа

    Якщо рядок розпізнається як числове значення, результуюче значення та тип визначається так, як показано далі.

    Якщо рядок не містить жодного із символів ".", "e", або "E", і значення числа поміщається в межі цілих чисел (визначених PHP_INT_MAX), рядок буде розпізнаний як ціле число ( integer). У решті випадків вона вважається числом з плаваючою точкою ( float).

    Значення визначається за початковою частиною рядка. Якщо рядок починається з вірного числового значення, це значення буде використано. Інакше значенням буде 0 (нуль). Вірне числове значення - це одна або більше цифр (що можуть містити десяткову точку), за бажанням попередніх знаком з наступним необов'язковим показником ступеня. Показник ступеня - це "e" або "E" з наступними однією чи більше цифрами.

    $ foo = 1 + "10.5"; // $foo це float (11.5)
    $foo = 1 + "-1.3e3"; // $foo це float (-1299)
    $foo = 1 + "bob-1.3e3"; // $foo це integer (1)
    $ foo = 1 + "bob3"; // $foo це integer (1)
    $foo = 1 + "10 Small Pigs"; // $foo це integer (11)
    $foo = 4 + "10.2 Little Piggies"; // $foo це float (14.2)
    $foo = "10.0 pigs" + 1; // $foo це float (11)
    $foo = "10.0 pigs" + 1.0; // $foo це float (11)
    ?>

    Докладніше про це перетворення див. у розділі strtod(3) документації Unix.

    Якщо ви хочете протестувати будь-який з прикладів цього розділу, скопіюйте та вставте його та наступний рядок, щоб побачити, що відбувається:

    echo "\$foo== $foo ; тип: " . gettype ($ foo). "
    \n" ;
    ?>

    Не чекайте отримати код символу, перетворивши його на ціле (як це робиться, наприклад, на C). Для перетворення символів в їх ASCII-коди та назад використовуйте функції ord()і chr().

    Подробиці реалізації рядкового типу

    7 років тому

    Documentation не mention, але closing semicolon на кінці heredoc є в даний час interpreted як реальний semicolon, і як such, деякі ліки до syntax errors.

    $foo =<<abcd
    END;
    ?>

    This does not:

    foo (<<abcd
    END;
    );
    // syntax error, unexpected ";"
    ?>

    Без semicolon, це роботи fine:

    foo (<<abcd
    END
    );
    ?>

    3 years ago

    Ви можете використовувати string як array of char (like C)

    $a = "String array test";

    var_dump($a);
    // Return string(17) "String array test"

    var_dump($a);
    // Return string(1) "S"

    // -- With array cast --
    var_dump((array) $a);
    // Return array(1) ( => string(17) "String array test")

    var_dump((array) $a);
    // Return string(17) "S"

    Norihiori

    15 років тому

    Ви можете скористатися комплексною syntax до запуску рівня об'єкта властивостей AND об'єкта методів всередині string. For example...
    class Test (
    public $one = 1;
    public function two () (
    return 2;
    }
    }
    $ test = new Test ();
    echo "foo ($ test -> one) bar ($ test -> two ())";
    ?>
    Will output "foo 1 bar 2".

    However, ви не можете це зробити для всіх цін у вашому namespace. Class constants and static properties/methods not work because the complex syntax looks for the "$".
    class Test (
    const ONE = 1;
    }
    echo "foo (Test::ONE) bar";
    ?>
    Це буде output "foo (Test::one) bar". Константи і статистика потребує вашої перерви в string.

    3 years ago

    Beware that consistent with "String conversion to numbers":

    If ("123abc" == 123) echo "(intstr == int) incorrectly tests as true.";

    // Тому один пункт є числом, string is incorrectly converted from intstr to int, which then matches the test number.

    // True for all conditionals such as if and switch statements (probably also while loops)!

    // Це означає, що велика шкода ризику, коли тестування/використання/завдання user input, коли expecting and testing for only an integer.

    // It seems only fix is ​​for 123 to be string as "123" so no conversion happens.

    ?>

    6 років тому

    Leading zeroes в strings are (least-surprise) не treated as octal.
    Consider:
    $ x = "0123" + 0;
    $ y = 0123 + 0;
    echo "x є $x, y є $y"; //prints "x is 123, y is 83"
    in other words:
    * Leading zeros в numeric literals в source-code є interpreted as "octal", c.f. strtol().
    * Leading zeros in strings (eg user-submitted data), коли cast (implicitly or explicitly) до integer є ignored, і considered as decimal, c.f. strtod().

    10 років тому

    Тут є простий захват до двох-quoted strings і heredocs до позначення arbitrary expressions в curly braces syntax, including constants and other function calls:

    // Hack declaration
    function _expr ($v) ( return $v ; )
    $_expr = "_expr";

    // Our playground
    define ("qwe" , "asd");
    define("zxc", 5 );

    $a= 3 ;
    $b= 4 ;

    function c($a, $b) ( return$a+ $b; }

    // Usage
    echo"pre{ $_expr(1 + 2 )} post\n"; // outputs "pre 3 post"
    echo"pre{ $_expr(qwe)} post\n"; // outputs "pre asd post"
    echo"pre{ $_expr(c($a, $b)+ zxc* 2 )} post\n"; // outputs "pre 17 post"

    // General syntax is ($_expr(...))
    ?>

    2 years ago

    Я думаю, що вона може бути корисною для того, щоб сказати цей коментар, що information at least appears на правій сторінці на PHP site.

    Зверніть увагу, що якщо ви утримуєте використання двостороннього зв'язку з особливим ключовим ключем, ви можете зробити в T_ENCAPSED_AND_WHITESPACE error. Кілька regard це як одна з найяскравіших error messages.

    An expression such as:

    $fruit=array(
    "a"=> "apple",
    "b"=> "banana",
    // etc
    );

    Print "This is a$fruit[ "a"]"; // T_ENCAPSED_AND_WHITESPACE
    ?>

    буде певно fall to pieces.

    Ви можете resolve it as follows:

    print"This is a$fruit[ a] " ; // unquote the key
    print"This is a${ fruit[ "a"]} " ; // Complex Syntax
    print"This is a{ $fruit[ "a"]} " ; // Complex Syntax variation
    ?>

    I have personal preference для останньої variation as it is more natural and closer to what the expression would be like outside the string.

    Це не чітко (на мою думку, на рівні), коли PHP дає змогу вибрати один з найменших дзвінків всередині expresії, але я маю на увазі, що це будь-який час, щоб зробити fact quotes, які не є частиною значення string - 10 string is already bear parsed the quotes just get in the way … ?

    2 years ago

    Both should work:(

    classTesting{
    public static
    $VAR= "static";
    public const VAR =
    "const";

    Public function sayHelloStatic() {
    echo
    "hello:{ $this:: $VAR} " ;
    }

    Public function sayHelloConst() {
    echo
    "hello:{ $this::VAR)" ; //Parse error: syntax error, unexpected ")", expecting "["
    }
    }

    $obj= newTesting();
    $obj-> sayHelloStatic();
    $obj-> sayHelloConst();

    3 years ago

    Something I experienced which no doubt will help someone . . .
    In my editor, this will syntax highlight HTML і the $comment:

    $html =<<<"EOD"
    $comment
    EOD;

    За допомогою цієї shows all the same colour:

    $html =<<$comment
    EOD;

    making it a lot easier to work with

    11 років тому

    Для того, щоб висловити вашу думку, ви не можете прочитати попередні повідомлення про ваші дані ;)

    Якщо всі strings можуть бути встановлені на номери (in ("$a" > "$b") test), resulted numerics are used, else FULL strings are compared char-by-char:

    var_dump("1.22" > "01.23" ); // bool (false)
    var_dump("1.22.00" > "01.23.00" ); // bool(true)
    var_dump("1-22-00" > "01-23-00" ); // bool(true)
    var_dump((float)"1.22.00" > (float)"01.23.00" ); // bool (false)
    ?>

    mixed preg_replace(mixed pattern, mixed replacement, mixed subject [, int limit])

    Виконує пошук у рядку subject збігів із шаблоном pattern і замінює їх на replacement. У випадку, якщо параметр limit вказаний, буде зроблено заміну limit входжень шаблону; якщо limit опущений або дорівнює -1, будуть замінені всі входження шаблону.

    Replacement може містити посилання виду \n або (починаючи з PHP 4.0.4) $n , причому останній варіант кращий. Кожне таке посилання буде замінено на підрядок, що відповідає n "нної укладеної в круглі дужки підмасці. n може приймати значення від 0 до 99, причому посилання \\0 (або $0) відповідає входженню всього шаблону. Підмаски нумеруються зліва направо, починаючи з одиниці .

    При використанні заміни шаблону з використанням посилань на підмаски може виникнути ситуація, коли безпосередньо за маскою слідує цифра. У такому разі нотація виду \\n призводить до помилки: посилання на першу підмаску, за якою слідує цифра 1, запишеться як \\11 , що буде інтерпретовано як посилання на одинадцяту підмаску. Це непорозуміння можна усунути, якщо скористатися конструкцією \$(1)1 , що вказує на ізольоване посилання на першу підмаску, і цифру 1 .

    Результатом цього прикладу буде:

    April1,2003

    Якщо під час виконання функції виявлено збіги з шаблоном, буде повернено змінене значення subject , інакше буде повернено вихідний текст subject .

    Перші три параметри функції preg_replace()можуть бути одновимірними масивами. У випадку, якщо масив використовує ключі, при обробці масиву вони будуть взяті в порядку, в якому вони розташовані в масиві. Вказівка ​​ключів у масиві для pattern та replacement не є обов'язковою. Якщо ви все ж таки вирішили використовувати індекси, для зіставлення шаблонів і рядків, що беруть участь у заміні, використовуйте функцію ksort()для кожного з масивів.


    Приклад 2. Використання масивів з числовими індексами як аргументи функції preg_replace()

    $string = "The quick brown fox jumped over the lazy dog.";$patterns [ 0 ] = "/quick/";
    $ patterns [1] = "/brown/";
    $ patterns [ 2 ] = " / fox / " ; $ replacements [ 2 ] = " bear " ;
    $replacements [1] = "black";
    $replacements [ 0 ] = "slow" ;preg_replace ($patterns , $replacements , $string );
    ?>

    Результат:

    Результат:

    Slow black bear скитався над лагідним dog.

    У випадку, якщо параметр subject є масивом, пошук та заміна шаблону виконуються для кожного з його елементів. Результат, що повертається, також буде масивом.

    Якщо параметри pattern і replacement є масивами, preg_replace()по черзі витягує з обох масивів по парі елементів та використовує їх для операції пошуку та заміни. Якщо масив replacement містить більше елементів, ніж pattern, замість відсутніх елементів для заміни будуть взяті порожні рядки. У випадку, якщо pattern є масивом, а replacement - рядком, по кожному елементу масиву pattern буде здійснено пошук та заміну на pattern (шаблоном будуть по черзі всі елементи масиву, тоді як рядок заміни залишається фіксованим). Варіант, коли pattern є рядком, а replacement – ​​масивом, не має сенсу.

    Модифікатор /e змінює поведінку функції preg_replace()Таким чином, параметр replacement після виконання необхідних підстановок інтерпретується як PHP-код і тільки після цього використовується для заміни. Використовуючи цей модифікатор, будьте уважні: параметр replacement повинен містити коректний PHP-код, інакше у рядку, що містить виклик функції preg_replace(), виникне помилка синтаксису


    Приклад 3. Заміна на декілька шаблонів

    $ patterns = array ( "/(19|20)(\d(2))-(\d(1,2))-(\d(1,2))/",
    "/^\s*((\w+))\s*=/");
    $replace = array ("\3/\4/\1\2", "$\1 =");
    echo preg_replace ($patterns, $replace, "(startDate) = 1999-5-27");
    ?>

    Цей приклад виведе:

    Перетворює всі HTML-теги до верхнього регістру


    Приклад 5. Конвертор HTML у текст

    // $document на виході має містити HTML-документ.
    // Необхідно видалити всі HTML-теги, секції javascript,
    // Пробільні символи. Також необхідно замінити деякі
    // HTML-сутності з їхньої еквівалент.
    $search = array ( ""]*?>.*?"si", // Вирізує javaScript
    ""<[\/\!]*?[^<>]*?>"si" , // Вирізує HTML-теги
    ""([\r\n])[\s]+"" , // Вирізує пробільні символи
    ""&(quot|#34);"i" , // Замінює HTML-сутності
    ""&(amp|#38);"i" ,
    ""&(lt|#60);"i" ,
    ""&(gt|#62);"i" ,
    ""&(nbsp|#160);"i" ,
    ""&(iexcl|#161);"i" ,
    ""&(cent|#162);"i" ,
    ""&(pound|#163);"i" ,
    ""&(copy|#169);"i" ,
    ""(\d+);"e" ); // Інтерпретувати як php-код$replace = array ("",
    "" ,
    "\\1" ,
    "\"" ,
    "&" ,
    "<" ,
    ">" ,
    " " ,
    chr (161),
    chr (162),
    chr (163),
    chr (169),
    "chr(\\1)" ); $text = preg_replace ($search, $replace, $document);
    ?>

    Останнім часом обговорення мови 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:
    Радий, якщо хтось викладе свої результати даних тестів. Думаю, це дозволить об'єктивніше скласти оцінку необхідності використання того чи іншого способу підстановки в рядки. Також буду вдячний здоровій критиці стилю викладу та оформлення.

    Складання