Средство форматирования / улучшения кода Php и благоустройство php в целом [закрыто]
Вопрос
Знаете ли вы какие-нибудь хорошие инструменты для красивого форматирования беспорядочного php-кода?Предпочтительно скрипт для Aptana / Eclipse, но подойдет и автономный инструмент.
Решение
Средство для улучшения PHP-кода это полезный бесплатный инструмент, который должен делать то, что вам нужно, хотя их страница загрузки требуется создать учетную запись.
Инструмент был разделен на 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.
Видишь здесь для получения справки по установке.
Есть модуль pear, который форматирует ваш код. PHP-Конструктор
Если вы используете среду разработки Zend, вы можете использовать функцию отступа кода (Ctrl + Shift + F).
Вот класс для улучшения кода php (разумеется, PHP):
http://www.codeassembly.com/A-php-code-beautifier-that-works/
и
онлайн-демонстрация:
Используйте NetBeans PHP и нажмите alt + shift + F.
Среда разработки Zend теперь является плагином Eclipse, возможно, вы сможете запустить ее вместе с Aptana и просто использовать ее функцию Indent Code.
Я сам еще не обновился до плагина Eclipse, мне так нравится предыдущий ZDE.Хотя теперь, когда я действительно начал использовать Eclipse для других языков, я почти готов совершить скачок.
А как насчет этого:
http://universalindent.sourceforge.net/
Он объединяет в себе множество доступных форматеров и сгенерирует нужные вам скрипты, чтобы вы могли раздать их и заставить членов вашей команды использовать их перед совершением в следующий раз...Хотя...программы форматирования могут испортить ваш код и сделать его непригодным для использования...
Самое простое решение - просто использовать IDE, в которую это встроено.Если вы собираетесь писать код на PHP на регулярной основе, просто внесите 60 долларов за PhpStorm.Вы не пожалеете об этом.
http://www.jetbrains.com/phpstorm/
Он позволяет вам форматировать ваш код так, как вам нравится, используя простое сочетание клавиш на уровне файла или каталога, и обладает множеством других замечательных функций.
Наш PHP -Форматировщик надежно отформатирует ваш код.Он использует интерфейс на основе компилятора для синтаксического анализа кода, поэтому он не искажает код и не повреждает его.Следовательно, его форматированный вывод всегда работает.
phpformatter.com работает лучше всего
"Этот бесплатный онлайн PHP-форматер разработан таким образом, чтобы вы могли украсить весь свой PHP-скрипт тем стилем, который вы предпочитаете"
Это отличный вопрос.У меня есть приложение, которое читает json и выводит php, html и css.Я запускаю программу и генерирую десятки (сотни?) файлов.Я надеюсь, что приведенный здесь ответ будет полезным.
Я начал свой проект, используя heredocs, специальные включаемые файлы, мета-символы и т.д., но это быстро привело к беспорядку.Мне нужно было автономное решение, которое не требовало бы фреймворка или ide.Поэтому я удалил весь heredoc и прочий мусор и создал универсальный класс буферизации текста, не заботясь о форматировании.Все это может быть одной строкой, мне все равно.Для html я использую встроенную функцию tidy().Для php я использую phpstylist ( php - стилист).phpstylist устарел, но все еще хорошо работает для формата php.
Чтобы настроить параметры phpstylist, я использовал Универсальный индент (обновлено в январе 2012) в графическом интерфейсе Windows.
UniversalStylist перечисляет 24 (!) программы форматирования (c, php, ruby, html, ...).Он специально знает параметры для phpstylist и предоставляет вам оперативное обновление файла при включении и выключении параметров.Очень здорово.Затем, когда у вас есть свой стиль, у него есть возможность сохранить параметры командной строки и сгенерировать скрипт.Для некоторых параметров форматирования вам придется добавить пути к perl, python и т.д.
Если вы используете Windows и хотите попробовать phpstylist с UniversalIndent, просто добавьте directory для php.exe в свой env path.Я использую амперы итак, у меня установлено значение c:\ampps\php.
Найти хорошее твердое решение было не очень просто.Мне также интересно услышать, что другие люди делают для максимально простого пакетного форматирования автоматически сгенерированных php / html файлов для проверки кода и архивирования.
У меня также возникли большие проблемы с поиском приличного бесплатного форматера для PHP, есть много онлайн-инструментов и инструментов командной строки, но они, похоже, просто не работают по какой-то причине, результаты по-прежнему полны плохих отступов с комбинациями табуляции и пробелов, и они никогда не расставляют фигурные скобки так, как вы хотите!
Я попробовал приведенный выше фрагмент, и у меня это тоже не сработало, отступы по-прежнему заполнены пробелами, а табуляции перепутаны.
Итак, я тоже попробовал написать простую версию, в которой просто используются все регулярные выражения, никакой причудливой магии компилятора, так что вполне возможно, что она может что-то сломать, и все еще находится в стадии бета-тестирования и тестируется на различном грязном коде.Интерфейс на данный момент тоже очень простой, но должен улучшиться в течение следующих нескольких дней.
Он запрограммирован для соглашений MediaWiki, но вы можете довольно легко изменить его (возможно, я добавлю параметры позже).