Средство форматирования/улучшения кода PHP и благоустройство php в целом

Знаете ли вы какие-нибудь хорошие инструменты для красивого форматирования беспорядочного php-кода? Желательно скрипт для Aptana/Eclipse, но подойдет и отдельный инструмент.


person deadprogrammer    schedule 29.09.2008    source источник
comment
Из всего, что я пробовал, это лучшее, что вы можете найти в Интернете: cleancss.com/php-beautify. Предупреждение: избегайте начального тега ‹?php.   -  person nawfal    schedule 17.11.2015


Ответы (14)


PHP Code Beautifier – полезный бесплатный инструмент, который должен делать то, что вам нужно, хотя его < href="http://www.waterproof.fr/products/phpCodeBeautifier/download.php" rel="noreferrer">страница загрузки требует создания учетной записи.

Инструмент был отклонен в 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;
        }
    }
}
person ConroyP    schedule 29.09.2008
comment
FWIW, это приложение с закрытым исходным кодом, недоступное для Mac OS X. - person nohat; 06.10.2009
comment
Это действительно сработало для кого-нибудь? Я попробовал пример командной строки в хорошо отформатированном скрипте, и он дал очень неравномерный отступ: 8 пробелов для первой строки каждой функции и 8 или 9 для остальных строк (казались случайными). Кроме того, закрывающая скобка для функций всегда была с отступом в 9 пробелов. - person David Harkness; 10.06.2011
comment
Я могу подтвердить. Он создает код, который необходимо отформатировать еще раз с помощью другого инструмента :| - person Pawka; 07.09.2011
comment
Обратите внимание: этот инструмент устарел, не поддерживается и не имеет открытого исходного кода! - person mate64; 14.02.2015
comment
Ссылка для PHP Code Beautifier не работает - person HDJEMAI; 21.04.2017
comment
Как вы должны использовать это, если вам нужно форматировать при каждом... сохранении? - person Ben Affleck; 10.06.2018

Ну вот мой очень простой и грубый сценарий:

#!/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;
    }
}
person grom    schedule 30.01.2009
comment
Зачем использовать существующий проверенный инструмент, если можно написать свой собственный? +1 за написание на php. - person postfuturist; 31.01.2009
comment
КАКИЕ? Вы действительно это написали? - person ; 20.05.2010
comment
Да, я написал свой собственный, потому что я не мог найти ни одного из существующих, которым бы я был доволен. - person grom; 20.05.2010
comment
Может кто-нибудь превратить это в плагин Eclipse? - person Randell; 22.09.2010
comment
Вы использовали его для форматирования источника форматирования? :-) - person Pawka; 07.09.2011
comment
как я могу это выполнить? я не могу запустить этот скрипт... он сказал, что имя файла не может быть пустым... =/ я надеюсь дать нам пошаговую инструкцию. благодаря. - person user453089; 04.11.2011
comment
Я только что попробовал это от Cygwin. Кажется, больше не работает. Он в основном распечатал мой оригинальный исходный код. Это потому, что Stack Overflow изменил ваш скрипт, например, табуляция превратилась в пробел, или наоборот? - person oldpride; 17.09.2020

http://en.sourceforge.jp/projects/pdt-tools/

^^^ даст вам правильный форматировщик CTRL+SHIFT+F Eclipse/Aptana PHP, такой как Java.

См. здесь помощь по установке.

форматировщик php-кода eclipse

person Chris    schedule 19.08.2010
comment
ссылка на инструкции по установке больше не доступна - person Gary; 01.06.2011
comment
Просто нормально у меня загрузился. Заголовок страницы: Aptana and Eclispe — средство форматирования кода для инструментов разработки PHP для Eclipse. - person Chris; 01.06.2011
comment
Проект, кажется, мертв на sourceforge. Ты знаешь, где я могу это сейчас? - person deadalnix; 12.10.2011

Есть грушевый модуль, который форматирует ваш код. Украшение PHP

person projecktzero    schedule 06.08.2010
comment
Это выглядит многообещающе, но я не смог заставить работать большинство опций (например, положение фигурной скобки класса/функции и новые строки раньше). Кроме того, он удаляет все пустые строки, даже между функциями и свойствами класса, и я не смог увидеть список токенов для фильтра NewLines. Есть ли список рассылки для этого проекта? - person David Harkness; 10.06.2011
comment
Позже я обнаружил, что он пережевывает пустые строки. знак равно - person projecktzero; 12.06.2011
comment
Хорошо, что это FOSS, так что вы можете расширить его по своему вкусу. - person Deckard; 21.05.2012

Если вы используете Zend Development Environment, вы можете использовать функцию отступа кода (Ctrl+Shift+F).

person Ian P    schedule 29.09.2008
comment
Также включено в Затмение - person Bob Fanger; 01.02.2009

Используйте NetBeans PHP и нажмите клавиши ALT+SHIFT+F.

person Stefan Brinkmann    schedule 11.04.2013

Вот класс для улучшения кода php (разумеется, PHP):
http://www.codeassembly.com/A-php-code-beautifier-that-works/

и

онлайн-демонстрация:

http://www.codeassembly.com/examples/beautifier.php

person micahwittman    schedule 29.09.2008
comment
Действительно, пример ушел. Вот еще одна библиотека для украшения: github.com/clbustos/PHP_Beautifier. - person micahwittman; 17.02.2013
comment
Внимание! Эта библиотека устарела и не поддерживается! - person mate64; 14.02.2015

Zend Development Environment теперь является подключаемым модулем Eclipse, вы можете запустить его вместе с Aptana и просто использовать его функцию Indent Code.

Zend Studio

Я еще не обновился до плагина Eclipse, мне очень нравится предыдущий ZDE. Хотя теперь, когда я начал фактически использовать Eclipse для других языков, я почти готов сделать скачок.

person Adam    schedule 29.09.2008

Что насчет этого:

http://universalindent.sourceforge.net/

Он объединяет множество средств форматирования и генерирует сценарии, которые вам нужны, чтобы вы могли передать их и заставить членов вашей команды использовать их перед фиксацией в следующий раз... Хотя... средства форматирования могут испортить ваш код и отобразить его. непригодный...

person SeanJA    schedule 30.04.2009
comment
Если код непригоден, какой смысл использовать этот форматер? - person Viet; 27.04.2010
comment
Любой форматировщик, который запускается автоматически, будет иметь этот риск, поэтому стоит отметить - person SeanJA; 27.04.2010
comment
Форматтеры не должны ломать ваш код. Они должны разобрать его точно. Те, кто анализирует с помощью регулярных выражений, обычно этого не делают, поэтому... ломаются. - person Ira Baxter; 18.05.2010
comment
Также может закончиться нехватка памяти или возникнуть исключение, или вы можете написать какой-то код, который парсер не понимает (функции, которые были добавлены в более позднюю версию языка, но еще не поддерживаются вашим парсером). - person SeanJA; 19.05.2010
comment
Форматтер вряд ли исчерпает память; гигабайт оперативной памяти — это много даже по сравнению со 100 тысячами строк PHP-скрипта. Если вы можете написать код, который синтаксический анализатор не понимает, то синтаксический анализатор реализован глупо; хорошие - нет, а хорошие - обновлены в отношении средств языка PHP. - person Ira Baxter; 19.05.2010
comment
Хорошо... но если вы не обновляете средство форматирования... тогда вы испортите свой код. - person SeanJA; 20.05.2010
comment
Кроме того, поскольку этот формат включает в себя форматтер, который был в принятом решении, я не понимаю, почему вы обсуждаете тот факт, что он может испортить ваш код. - person SeanJA; 20.05.2010

Самое простое решение — просто использовать встроенную среду IDE. Если вы собираетесь писать код на PHP на регулярной основе, просто откажитесь от 60 долларов за PHPStorm. Вы не пожалеете об этом.

http://www.jetbrains.com/phpstorm/

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

person Aaron    schedule 17.04.2012
comment
о, у NetBeans и Eclipse тоже есть встроенный, и они оба бесплатны, поэтому я действительно не понимаю смысла этого вопроса... - person Aaron; 18.04.2012

Наш модуль форматирования PHP надежно отформатирует ваш код. Он использует внешний интерфейс на основе компилятора для анализа кода, поэтому он не интерпретирует код неправильно и не повреждает его. Следовательно, его форматированный вывод работает всегда.

person Ira Baxter    schedule 18.05.2010
comment
50 долларов — это слишком много для чего-то, что я даже не могу попробовать, прежде чем купить. - person deadprogrammer; 19.05.2010
comment
Можешь попробовать. Перейдите на страницу загрузки. - person Ira Baxter; 19.05.2010
comment
Как внешний интерфейс на основе компилятора волшебным образом спасает вас от ошибок в коде форматирования? - person cweiske; 30.04.2011
comment
@Cweiske: это не так. Но поскольку он предназначен для интенсивного использования, он построен на чрезвычайно прочном фундаменте, включая механизм для правильного захвата лексем (особенно текст HTML и строковые литералы с их сложным синтаксисом в PHP), и огромное количество энергии, вложенное в тщательное тестирование. . Это намного надежнее, чем какой-нибудь специальный модуль форматирования, основанный на регулярных выражениях и переборке строк, который часто допускает ошибки при столкновении со сложным синтаксисом, таким как строки и комментарии, которые могут содержать элементы, похожие на код. - person Ira Baxter; 30.04.2011
comment
Скажи ваааааа!!!!!! - person Ben Affleck; 10.06.2018

phpformatter.com работает лучше всего

«Этот бесплатный онлайн-форматировщик PHP предназначен для того, чтобы вы могли украсить весь свой PHP-скрипт в соответствии со стилем, который вы предпочитаете»

person vaichidrewar    schedule 12.05.2012

Это отличный вопрос. У меня есть приложение, которое читает 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. Я использую amps, поэтому для меня установлено значение c:\ampps\php.

Было не очень легко найти хороший твердый раствор. Мне также интересно узнать, что другие люди делают для максимально простого пакетного форматирования автоматически сгенерированных файлов php/html для проверки кода и целей архивирования.

person user1501974    schedule 22.07.2012

У меня было много проблем с поиском достойного бесплатного форматирования для PHP, есть много онлайн-инструментов и инструментов командной строки, но они просто по какой-то причине не работают, результаты все еще полны плохих отступов с комбинациями табуляции и пробелов, и они никогда не получают фигурные скобки так, как вы хотите!

Я попробовал приведенный выше фрагмент, и это тоже не сработало для меня, отступы все еще полны пробелов и вкладок, все смешано.

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

Он жестко связан с соглашениями MediaWiki, но вы можете довольно легко изменить его (позже я могу добавить параметры).

https://www.organicdesign.co.nz/Special:CodeTidy

person Aran    schedule 21.05.2015