Intereting Posts
Как загрузить XML, когда PHP не может указать правильную кодировку? Временной интервал Ajax для вызова функции php PHP: список всех включает Codeigniter – динамическое получение относительного / абсолютного пути вне папки приложения Изменение размера изображения с помощью пропорций Symfony 2 – Макет встраивает "no entity / class form" проверка не работает как получить подкатегорию третьего уровня в верхнем меню Opencart v2.3 E_NOTICE: Насколько полезно ДЕЙСТВИТЕЛЬНО исправить все? Рекурсивное преобразование из SimpleXMLObject в массив Нужен пример того, как получить предпочтительный язык из заголовка запроса Accept-Language Чтобы понять заголовок PHP () PHP получает элемент в массиве с наибольшим количеством дубликатов Заголовки для вывода изображения PNG, чтобы убедиться, что он кэшируется в браузере? не удалось обработать запрос ajax из небольшого модуля чата Используйте сеанс входа в Facebook на другой странице

Каковы некоторые практические применения токенизатора PHP?

Какие практические и изощренные примеры использования PHP Tokenizer ?

Кто-нибудь использовал это?

Solutions Collecting From Web of "Каковы некоторые практические применения токенизатора PHP?"

Я использую PHP_CodeSniffer для соответствия стиля кодирования, который построен на токенизаторе. Кроме того, некоторые структуры (например, Symfony 2) используют токенизатор для генерации файлов кеша или файлов промежуточного класса кода PHP. Также можно использовать токенизатор для создания форматирования исходного кода или синтаксического маркера.

В принципе, везде, где вы используете PHP-код в качестве данных, вы можете использовать токенизатор. Гораздо надежнее пытаться разобрать PHP-код с регулярными выражениями или другими функциями обработки строк.

Я лично уже использовал его для создания песочницы PHP , которая пытается создать более безопасную среду для выполнения PHP-скриптов.

Кроме того, я провел множество экспериментов по препроцессу PHP, например, у меня есть (незавершенный) эмулятор PHP 5.3 для PHP 5.2, называемый prephp .

И многие другие подобные инструменты, такие как анализаторы исходного кода (для аудита безопасности , анализа стиля кода , …), также используют Tokenizer.

Но даже для небольших вещей Tokenizer может быть удобен. Не только крупномасштабные анализаторы кода. Например, если вы принимаете массив PHP и хотите проверить, что он не злонамерен, вы можете сделать это с помощью Tokenizer .

PS: В настоящее время я перехожу к фактическому анализу PHP, а не просто к его токенированию, используя парсер PHP, написанный на PHP, который я недавно опубликовал (он работает, но на самом деле он практически не используется).

Интересный вопрос.

Я еще не использовал токенизатор в любых производственных проектах, но есть несколько вопросов о переполнении стека, к которым токенизатор является (или, по крайней мере, одним) правильным ответом.

  • Автоматический синтаксический разбор PHP для разделения PHP-кода на HTML – извлечение комментариев из PHP-кода, например, для создания документации ( phpDocumentor работает таким образом)

  • Класс существует во внешнем файле – анализируя код, видя, существует ли класс внутри файла (например, для системы управления плагинами)

  • Постоянно записывать переменные в php-файл с PHP-файлами исходного кода PHP, например, для заполнения переменных конфигурации. Использование токенизатора будет первым шагом для этого на уровне анализатора.

  • Как создать список всех встроенных функций PHP, которые использует проект? – анализ того, какие функции используются в проекте PHP

Довольно простое использование подсветки синтаксиса.

 foreach(token_get_all($source) as $token) { if (is_array($token)) { $map = "token_name"; echo "<span class={$map($token[0])}>$token[1]</span>"; } else { echo "<span class=T_RAW>$token</span>"; } } 

Конечно же, номера маркеров обычно преобразуются в более удобные имена классов CSS, но вы можете просто создать таблицу стилей только с классами .T_COMMENT, .T_ARRAY, .T_ELSEIF, .T_FUNCTION ….

Я использовал токенизатор, чтобы найти число циклической сложности и некоторые другие кодовые метрики обратного вызова:

 if ((isset($reflection) === true) && ($reflection->getFileName() !== false)) { if (($source = file($reflection->getFileName(), FILE_IGNORE_NEW_LINES)) !== false) { $source = implode("\n", array_slice($source, $reflection->getStartLine() - 1, $reflection->getEndLine() - ($reflection->getStartLine() - 1))); $result[$key]['source'] = array ( 'ccn' => 1, 'statements' => 0, 'lines' => array ( 'logical' => array(), 'physical' => substr_count($source, "\n"), ), ); if (is_array($tokens = token_get_all(sprintf('<?php %s ?>', $source))) === true) { $points = array_map('constant', array_filter(array ( 'T_BOOLEAN_AND', 'T_BOOLEAN_OR', 'T_CASE', 'T_CATCH', 'T_ELSEIF', 'T_FINALLY', 'T_FOR', 'T_FOREACH', 'T_GOTO', 'T_IF', 'T_LOGICAL_AND', 'T_LOGICAL_OR', 'T_LOGICAL_XOR', 'T_WHILE', ), 'defined')); foreach ($tokens as $token) { if (is_array($token) === true) { if ((in_array($token[0], array(T_CLOSE_TAG, T_COMMENT, T_DOC_COMMENT, T_INLINE_HTML, T_OPEN_TAG), true) !== true) && (strlen(trim($token[1])) > 0)) { if (in_array($token[0], $points, true) === true) { ++$result[$key]['source']['ccn']; } array_push($result[$key]['source']['lines']['logical'], $token[2]); } } else if (strncmp($token, '?', 1) === 0) { ++$result[$key]['source']['ccn']; } else if (strncmp($token, ';', 1) === 0) { ++$result[$key]['source']['statements']; } } $result[$key]['source']['lines']['logical'] = max(0, count(array_unique($result[$key]['source']['lines']['logical'])) - 1); } } } 

Один мой знакомый написал Überloader (автозагрузчик грубой силы для PHP5.), Который использует этот самый метод, когда он индексирует файлы классов. Метод _check_file() от него будет представлять для вас особый интерес.

Überloader предназначен для устаревших проектов, которые не планировали или не думали об их соглашениях об именах или файловых структурах.

Я использую класс каждый день в старых проектах, которые я исправляю или обновляю.

Из комментария в руководстве PHP :

Функции токенизатора достаточно сильны. Например, вы можете получить все методы в данном классе, используя алгоритм, например:

для каждого токена: если токен T_FUNCTION, тогда запустите буфер, если буфер запущен, затем добавьте текущую строку в буфер, если токен (стоп-буфер

И самое главное, что методы класса будут иметь правильный аргумент, так что это хороший способ обойти ограничения с get_class_methods, возвращающими имена нижнего регистра. Кроме того, поскольку с помощью аналогичного алгоритма вы можете прочитать аргументы функции, вы можете реализовать Reflections-подобные функции в PHP4.

Наконец, вы можете использовать его в качестве более простого метода извлечения Javadoc из файла класса для создания документации. Класс util / MethodTable.php в AMFPHP (http://www.amfphp.org) использует функции токенизатора для создания таблицы методов со всеми аргументами, описанием, типом возврата и т. Д., И из этой таблицы методов он может генерировать ActionScript, который соответствует PHP, но он также может быть настроен для генерации JavaScript, файлов документации или, в основном, всего, на что вы положили свой ум. Я также вижу, что это может быть базой для генератора файлов классов -> WSDL.

Вы можете использовать для сбора различной информации о каком-либо php-коде, например, о всех определенных классах, методах, переменных, генерации документации и подобных задачах.

Я работаю над устаревшим приложением Symfony 1.2, и я использую токенизатор для получения всех вызовов sfConfig::get() и sfConfig::set() .

Поэтому в основном я документирую все параметры конфигурации своего приложения.