Php код форматера / украшения и php украшения в целом
Знаете ли вы какие-нибудь хорошие инструменты для удобного форматирования грязного PHP-кода? Желательно скрипт для Aptana/Eclipse, но автономный инструмент тоже подойдет.
14 ответов
PHP Code Beautifier - это полезный бесплатный инструмент, который должен делать то, что вам нужно, хотя их страница загрузки требует создания учетной записи.
Инструмент был отклонен на 3 версии:
- Версия с графическим интерфейсом, которая позволяет визуально обрабатывать файл.
- Версия для командной строки, которая позволяет пакетировать или интегрировать с другими инструментами (CVS, SubVersion, IDE ...).
- Как интегрированный инструмент PHPEdit.
В основном это получится:
if($code == BAD){$action = REWRITE;}else{$action = KEEP;}
for($i=0; $i<10;$i++){while($j>0){$j++;doCall($i+$j);if($k){$k/=10;}}}
в
if ($code == BAD) {
$action = REWRITE;
} else {
$action = KEEP;
}
for($i = 0; $i < 10;$i++) {
while ($j > 0) {
$j++;
doCall($i + $j);
if ($k) {
$k /= 10;
}
}
}
Ну вот мой очень простой и грубый сценарий:
#!/usr/bin/php
<?php
class Token {
public $type;
public $contents;
public function __construct($rawToken) {
if (is_array($rawToken)) {
$this->type = $rawToken[0];
$this->contents = $rawToken[1];
} else {
$this->type = -1;
$this->contents = $rawToken;
}
}
}
$file = $argv[1];
$code = file_get_contents($file);
$rawTokens = token_get_all($code);
$tokens = array();
foreach ($rawTokens as $rawToken) {
$tokens[] = new Token($rawToken);
}
function skipWhitespace(&$tokens, &$i) {
global $lineNo;
$i++;
$token = $tokens[$i];
while ($token->type == T_WHITESPACE) {
$lineNo += substr($token->contents, "\n");
$i++;
$token = $tokens[$i];
}
}
function nextToken(&$j) {
global $tokens, $i;
$j = $i;
do {
$j++;
$token = $tokens[$j];
} while ($token->type == T_WHITESPACE);
return $token;
}
$OPERATORS = array('=', '.', '+', '-', '*', '/', '%', '||', '&&', '+=', '-=', '*=', '/=', '.=', '%=', '==', '!=', '<=', '>=', '<', '>', '===', '!==');
$IMPORT_STATEMENTS = array(T_REQUIRE, T_REQUIRE_ONCE, T_INCLUDE, T_INCLUDE_ONCE);
$CONTROL_STRUCTURES = array(T_IF, T_ELSEIF, T_FOREACH, T_FOR, T_WHILE, T_SWITCH, T_ELSE);
$WHITESPACE_BEFORE = array('?', '{', '=>');
$WHITESPACE_AFTER = array(',', '?', '=>');
foreach ($OPERATORS as $op) {
$WHITESPACE_BEFORE[] = $op;
$WHITESPACE_AFTER[] = $op;
}
$matchingTernary = false;
// First pass - filter out unwanted tokens
$filteredTokens = array();
for ($i = 0, $n = count($tokens); $i < $n; $i++) {
$token = $tokens[$i];
if ($token->contents == '?') {
$matchingTernary = true;
}
if (in_array($token->type, $IMPORT_STATEMENTS) && nextToken($j)->contents == '(') {
$filteredTokens[] = $token;
if ($tokens[$i + 1]->type != T_WHITESPACE) {
$filteredTokens[] = new Token(array(T_WHITESPACE, ' '));
}
$i = $j;
do {
$i++;
$token = $tokens[$i];
if ($token->contents != ')') {
$filteredTokens[] = $token;
}
} while ($token->contents != ')');
} elseif ($token->type == T_ELSE && nextToken($j)->type == T_IF) {
$i = $j;
$filteredTokens[] = new Token(array(T_ELSEIF, 'elseif'));
} elseif ($token->contents == ':') {
if ($matchingTernary) {
$matchingTernary = false;
} elseif ($tokens[$i - 1]->type == T_WHITESPACE) {
array_pop($filteredTokens); // Remove whitespace before
}
$filteredTokens[] = $token;
} else {
$filteredTokens[] = $token;
}
}
$tokens = $filteredTokens;
function isAssocArrayVariable($offset = 0) {
global $tokens, $i;
$j = $i + $offset;
return $tokens[$j]->type == T_VARIABLE &&
$tokens[$j + 1]->contents == '[' &&
$tokens[$j + 2]->type == T_STRING &&
preg_match('/[a-z_]+/', $tokens[$j + 2]->contents) &&
$tokens[$j + 3]->contents == ']';
}
// Second pass - add whitespace
$matchingTernary = false;
$doubleQuote = false;
for ($i = 0, $n = count($tokens); $i < $n; $i++) {
$token = $tokens[$i];
if ($token->contents == '?') {
$matchingTernary = true;
}
if ($token->contents == '"' && isAssocArrayVariable(1) && $tokens[$i + 5]->contents == '"') {
/*
* Handle case where the only thing quoted is the assoc array variable.
* Eg. "$value[key]"
*/
$quote = $tokens[$i++]->contents;
$var = $tokens[$i++]->contents;
$openSquareBracket = $tokens[$i++]->contents;
$str = $tokens[$i++]->contents;
$closeSquareBracket = $tokens[$i++]->contents;
$quote = $tokens[$i]->contents;
echo $var . "['" . $str . "']";
$doubleQuote = false;
continue;
}
if ($token->contents == '"') {
$doubleQuote = !$doubleQuote;
}
if ($doubleQuote && $token->contents == '"' && isAssocArrayVariable(1)) {
// don't echo "
} elseif ($doubleQuote && isAssocArrayVariable()) {
if ($tokens[$i - 1]->contents != '"') {
echo '" . ';
}
$var = $token->contents;
$openSquareBracket = $tokens[++$i]->contents;
$str = $tokens[++$i]->contents;
$closeSquareBracket = $tokens[++$i]->contents;
echo $var . "['" . $str . "']";
if ($tokens[$i + 1]->contents != '"') {
echo ' . "';
} else {
$i++; // process "
$doubleQuote = false;
}
} elseif ($token->type == T_STRING && $tokens[$i - 1]->contents == '[' && $tokens[$i + 1]->contents == ']') {
if (preg_match('/[a-z_]+/', $token->contents)) {
echo "'" . $token->contents . "'";
} else {
echo $token->contents;
}
} elseif ($token->type == T_ENCAPSED_AND_WHITESPACE || $token->type == T_STRING) {
echo $token->contents;
} elseif ($token->contents == '-' && in_array($tokens[$i + 1]->type, array(T_LNUMBER, T_DNUMBER))) {
echo '-';
} elseif (in_array($token->type, $CONTROL_STRUCTURES)) {
echo $token->contents;
if ($tokens[$i + 1]->type != T_WHITESPACE) {
echo ' ';
}
} elseif ($token->contents == '}' && in_array($tokens[$i + 1]->type, $CONTROL_STRUCTURES)) {
echo '} ';
} elseif ($token->contents == '=' && $tokens[$i + 1]->contents == '&') {
if ($tokens[$i - 1]->type != T_WHITESPACE) {
echo ' ';
}
$i++; // match &
echo '=&';
if ($tokens[$i + 1]->type != T_WHITESPACE) {
echo ' ';
}
} elseif ($token->contents == ':' && $matchingTernary) {
$matchingTernary = false;
if ($tokens[$i - 1]->type != T_WHITESPACE) {
echo ' ';
}
echo ':';
if ($tokens[$i + 1]->type != T_WHITESPACE) {
echo ' ';
}
} elseif (in_array($token->contents, $WHITESPACE_BEFORE) && $tokens[$i - 1]->type != T_WHITESPACE &&
in_array($token->contents, $WHITESPACE_AFTER) && $tokens[$i + 1]->type != T_WHITESPACE) {
echo ' ' . $token->contents . ' ';
} elseif (in_array($token->contents, $WHITESPACE_BEFORE) && $tokens[$i - 1]->type != T_WHITESPACE) {
echo ' ' . $token->contents;
} elseif (in_array($token->contents, $WHITESPACE_AFTER) && $tokens[$i + 1]->type != T_WHITESPACE) {
echo $token->contents . ' ';
} else {
echo $token->contents;
}
}
http://en.sourceforge.jp/projects/pdt-tools/
^^^ даст вам правильный формат CTRL+SHIFT+F Eclipse/Aptana PHP, такой как Java.
Смотрите здесь для помощи по установке.
Есть модуль груши, который форматирует ваш код. PHP Beautifier
Если вы используете Zend Development Environment, вы можете использовать функцию Indent Code (Ctrl+Shift+F).
Вот класс улучшения PHP-кода (конечно, PHP):
http://www.codeassembly.com/A-php-code-beautifier-that-works/
а также
онлайн демо:
Zend Development Environment теперь является плагином Eclipse, вы можете запустить его вместе с Aptana и просто использовать его функцию Indent Code.
Я еще не обновился до плагина Eclipse, мне очень нравится предыдущий ZDE. Хотя теперь, когда я начал использовать Eclipse для других языков, я почти готов совершить прыжок.
Что насчет этого:
http://universalindent.sourceforge.net/
Он объединяет несколько форматеров и генерирует скрипты, которые вам нужны, так что вы можете раздать их и заставить членов вашей команды использовать их перед фиксацией в следующий раз... Хотя... форматеры могут испортить ваш код и отобразить его непригодный для использования...
Самое простое решение - просто использовать интегрированную среду разработки, в которую это встроено. Если вы собираетесь писать код на PHP на регулярной основе, просто отбросьте $60 за PHPStorm. Вы не пожалеете об этом.
http://www.jetbrains.com/phpstorm/
Он позволяет вам форматировать код так, как вам нравится, с помощью простого сочетания клавиш на уровне файлов или каталогов, и имеет множество других замечательных функций.
Наш PHP Formatter надежно отформатирует ваш код. Он использует основанный на компиляторе интерфейс для анализа кода, поэтому он не интерпретирует код и не повреждает его. Следовательно, его форматированный вывод всегда работает.
http://phpformatter.com/ работает лучше всего
"Этот бесплатный онлайн-форматер PHP разработан так, что вы можете украсить все ваши PHP-скрипты в стиле, который вы предпочитаете"
Это отличный вопрос. У меня есть приложение, которое читает json и выводит php, html и css. Я запускаю программу и генерирую десятки (сотни?) Файлов. Я надеюсь, что ответ здесь полезен.
Я начал свой проект, используя heredocs, специальные включаемые файлы, мета-символы и т. Д., Но это быстро превратилось в беспорядок. Я хотел автономное решение, которое не требует рамок или ide. Поэтому я удалил весь heredoc и другой мусор и создал общий класс буферизации текста, не заботясь о форматировании. Все это может быть одной линией, мне все равно. Для html я делаю tidy() встроенным. Для php я использую phpstylist. phpstylist старше, но все еще хорошо работает для формата php.
Чтобы настроить параметры phpstylist, я использовал UniversalIndent (обновлено в январе 2012 г.) в графическом интерфейсе Windows.
UniversalStylist перечисляет 24 (!) Программы форматирования (c, php, ruby, html,...). Он, в частности, знает параметры для phpstylist и предоставляет вам обновление файла в режиме реального времени, когда вы включаете и выключаете параметры. Очень здорово Затем, когда у вас есть свой стиль, он имеет возможность сохранить параметры командной строки и создает сценарий. Для некоторых параметров форматирования вам нужно будет добавить пути к perl, python и т. Д.
Если вы используете Windows и хотите попробовать phpstylist с UniversalIndent, просто добавьте каталог для php.exe в путь env. Я использую ampps, поэтому мой установлен в c:\ampps\php.
Было не очень легко найти хорошее твердое решение. Мне также интересно услышать, что другие люди делают для максимально простого пакетного форматирования автоматически сгенерированных файлов php/html для проверки и архивирования кода.
У меня были большие проблемы с поиском подходящего бесплатного форматера для PHP, есть много онлайн-инструментов и инструментов командной строки, но они просто почему-то не работают, результаты все еще полны плохого отступа с комбинациями вкладок и пробелов, и они никогда не получат скобки так, как вы хотите!
Я попробовал приведенный выше фрагмент, и это тоже не сработало для меня, отступы все еще были заполнены пробелами и все перепутаны.
Так что я тоже попытался написать простую версию, в которой просто используется все регулярные выражения, нет причудливой магии компилятора, так что вполне возможно, что она может что-то сломать, и она все еще очень бета-версия и тестируется на различных беспорядочных кодах. Интерфейс на данный момент очень простой, но должен улучшиться в течение следующих нескольких дней.
Он встроен в соглашения MediaWiki, но вы можете довольно легко его изменить (я могу добавить опции позже).