| Recommend this page to a friend! | 
|  Download | 
| Info |  Files |  Install with Composer |  Download | Reputation | Support forum | Blog | Links | 
| Ratings | Unique User Downloads | Download Rankings | ||||
| Not enough user ratings | Total: 284 | All time:  7,565 This week: 206  | ||||
| Version | License | PHP version | Categories | |||
| phpcf 1.0.1 | GNU Lesser Genera... | 5.4 | PHP 5, Tools, Text processing | 
| Description | Author | |||
| This package can reformat PHP code according to standard options. Innovation Award 
 | 
Форматер был создан для того, чтобы в основном менять пробельные символы: переносы строк, отступы, пробелы вокруг операторов, и т.д. Таким образом, phpcf не заменяет другие схожие утилиты, такие как вышеупомянутый PHP Code Sniffer и PHP Coding Standards Fixer (http://cs.sensiolabs.org) от Фабьена Потенцьера. Он дополняет их, выполняя «грязную работу» по правильной расстановке пробелов и переносов строк в файле. Важно отметить, что наша утилита учитывает изначальное форматирование в файле и меняет только те пробелы, которые не соответствуют выбранному стандарту (в отличие от некоторых других решений, которые сначала удаляют все пробельные токены, а потом начинают форматирование).
Утилита расширяема и поддерживает произвольные наборы стилей. Можно достаточно легко определить свой стиль форматирования, который будет реализовать другой стандарт, отличный от нашего (стандарт кодирования в нашей компании очень близок к PSR).
Пример использования (команда “phpcf apply <filename>” форматирует указанный файл, а “phpcf check <filename>” проверяет форматирование и возвращает ненулевой exit-код в случае наличия неотформатированных фрагментов):
$ cat minifier.php
<?php
$tokens=token_get_all(file_get_contents($argv[1]));$contents='';foreach($tokens as $tok){if($tok[0]===T_WHITESPACE||$tok[0]===T_COMMENT)continue;if($tok[0]===T_AS||$tok[0]===T_ELSE)$contents.=' '.$tok[1].' '; else $contents.=is_array($tok)?$tok[1]:$tok;}echo$contents."\n";
$ phpcf apply minifier.php
minifier.php formatted successfully
$ cat minifier.php
<?php
$tokens = token_get_all(file_get_contents($argv[1]));
$contents = '';
foreach ($tokens as $tok) {
    if ($tok[0] === T_WHITESPACE || $tok[0] === T_COMMENT) continue;
    if ($tok[0] === T_AS || $tok[0] === T_ELSE) $contents .= ' ' . $tok[1] . ' ';
    else $contents .= is_array($tok) ? $tok[1] : $tok;
}
echo $contents . "\n";
$ phpcf check minifier.php; echo $?
minifier.php does not need formatting
0
Помимо форматирования файла целиком, наша утилита также умеет форматировать часть файла. Для этого нужно указать диапазоны номеров строк через двоеточие:
$ cat zebra.php 
<?php
echo "White "."strip".PHP_EOL;
echo "Black "."strip".PHP_EOL; // not formatted
echo "Arse".PHP_EOL;
$ phpcf apply zebra.php:1-2,4
zebra.php formatted successfully
$ cat zebra.php 
<?php
echo "White " . "strip" . PHP_EOL;
echo "Black "."strip".PHP_EOL; // not formatted
echo "Arse" . PHP_EOL;
$ phpcf check zebra.php
zebra.php issues:
        Expected one space before binary operators (= < > * . etc)   on line 3 column 14
        Expected one space after binary operators (= < > * . etc)   on line 3 column 15
        ...
$ echo $?
1
Даже несмотря на то, что утилита написана на PHP, форматирование большинства файлов проходит за доли секунды. Но у нас большой репозиторий и много кода, так что мы написали расширение, которое, будучи подключенным, увеличивает производительность работы в сотню раз: весь наш репозиторий в 2 миллиона строк форматируется за 8 секунд на «ноутбучном» Core i7. Для использования расширения требуется его собрать из директории “ext/”, установить, включить “enable_dl = On” в php.ini или прописать его как extension.
Хотелось бы еще раз подчеркнуть, что phpcf прежде всего меняет пробельные символы и умеет делать лишь простейшие преобразования над кодом: например, заменять короткий открывающий тег на длинный или убирать последний закрывающий тег из файла. Помимо этого, phpcf умеет автоматически исправлять кириллицу в названиях функций на английские символы. Также не трогаются выражения, выровненные вручную с помощью пробелов. Это происходит из-за архитектуры — форматер работает как конечный автомат с правилами, которые задает пользователь, а не как набор «захардкоженных» замен (форматер поставляется с «конфигом по умолчанию», соответствующим нашим правилам форматирования). Поэтому, если вы хотите автоматическую замену “var” на “public” или похожих вещей, рекомендуем обратить внимание на PHP-CS-Fixer — он мало внимания уделяет пробельным символам (в отличие от phpcf), но зато умеет переписывать токены.
|  Files (157) | / | phpcf-src | 
|  Files (157) | / | phpcf-src | / | ext | 
| File | Role | Description | 
|---|---|---|
|    config.m4 | Data | Auxiliary data | 
|    CREDITS | Data | Auxiliary data | 
|    phpcf.c | Data | Auxiliary data | 
|    php_phpcf.h | Data | Auxiliary data | 
|  Files (157) | / | phpcf-src | / | src | 
| File | Role | Description | ||
|---|---|---|---|---|
|  cli (8 files, 1 directory) | ||||
|  filter (3 files) | ||||
|  impl (2 files) | ||||
|  ClassLoader.php | Class | Class source | ||
|    defines.php | Conf. | Configuration script | ||
|  ExecStat.php | Class | Class source | ||
|  Formatter.php | Class | Class source | ||
|  FormattingResult.php | Class | Class source | ||
|  Helper.php | Class | Class source | ||
|  IFormatter.php | Class | Class source | ||
|    init.php | Conf. | Configuration script | ||
|  Options.php | Class | Class source | ||
|  Files (157) | / | phpcf-src | / | src | / | cli | 
| File | Role | Description | ||
|---|---|---|---|---|
|  git (5 files) | ||||
|  AbstractAction.php | Class | Class source | ||
|  ActionApply.php | Class | Class source | ||
|  ActionCheck.php | Class | Class source | ||
|  ActionPreview.php | Class | Class source | ||
|  ActionStdin.php | Class | Class source | ||
|  Ctx.php | Class | Class source | ||
|  Handler.php | Class | Class source | ||
|  IAction.php | Class | Class source | ||
|  Files (157) | / | phpcf-src | / | src | / | cli | / | git | 
| File | Role | Description | 
|---|---|---|
|  ActionApply.php | Class | Class source | 
|  ActionCheck.php | Class | Class source | 
|  ActionPreview.php | Class | Class source | 
|  GitCallback.php | Class | Class source | 
|  Helper.php | Class | Class source | 
|  Files (157) | / | phpcf-src | / | src | / | filter | 
| File | Role | Description | 
|---|---|---|
|  StringAscii.php | Class | Class source | 
|  StringAsciiMap.php | Class | Class source | 
|  StringAsciiMapCyr.php | Class | Class source | 
|  Files (157) | / | phpcf-src | / | src | / | impl | 
|  Files (157) | / | phpcf-src | / | styles | / | default | 
| File | Role | Description | 
|---|---|---|
|    context-rules.php | Conf. | Configuration script | 
|    formatting-rules.php | Conf. | Configuration script | 
|  Files (157) | / | phpcf-src | / | styles | / | example | 
| File | Role | Description | 
|---|---|---|
|    context-rules.php | Conf. | Configuration script | 
|    formatting-rules.php | Conf. | Configuration script | 
|  phpcf-class.php | Class | Class source | 
|    test-in.php | Test | Unit test script | 
|    test-out.php | Test | Unit test script | 
|  Files (157) | / | phpcf-src | / | test | 
| File | Role | Description | ||
|---|---|---|---|---|
|  expected (55 files) | ||||
|  functional_dirty (4 files) | ||||
|  original (55 files) | ||||
|    PhpCfFunctional.php | Test | Unit test script | ||
|    PhpCfTest.php | Test | Unit test script | ||
|  Files (157) | / | phpcf-src | / | test | / | expected | 
| File | Role | Description | 
|---|---|---|
|    alignment.php | Test | Unit test script | 
|    anonymous.php | Test | Unit test script | 
|    binary-operators.php | Test | Unit test script | 
|    brace-after-comma.php | Test | Unit test script | 
|    broken-switch.php | Test | Unit test script | 
|    class-comm.php | Test | Unit test script | 
|    classref-function.php | Test | Unit test script | 
|    classref.php | Test | Unit test script | 
|    close-tag-safe1.php | Test | Unit test script | 
|    close-tag-safe2.php | Test | Unit test script | 
|    close-tag-safe3.php | Test | Unit test script | 
|    close-tag-unsafe1.php | Test | Unit test script | 
|    closure.php | Test | Unit test script | 
|    comments.php | Test | Unit test script | 
|    const-comment.php | Test | Unit test script | 
|    const-nl.php | Test | Unit test script | 
|    cyrillic.php | Test | Unit test script | 
|    declare.php | Test | Unit test script | 
|    deref.php | Test | Unit test script | 
|    empty-call.php | Test | Unit test script | 
|    empty-method.php | Test | Unit test script | 
|    empty-while-foreach.php | Test | Unit test script | 
|    end-space.php | Test | Unit test script | 
|    expression-static-call.php | Test | Unit test script | 
|    finally.php | Test | Unit test script | 
|    function-name.php | Test | Unit test script | 
|    heredoc.php | Test | Unit test script | 
|    if-comment.php | Test | Unit test script | 
|    if.php | Test | Unit test script | 
|    implements.php | Test | Unit test script | 
|    increment.php | Test | Unit test script | 
|    instanceof.php | Test | Unit test script | 
|    long-arr.php | Test | Unit test script | 
|    long-classdef.php | Test | Unit test script | 
|    long-expr.php | Test | Unit test script | 
|    long-params.php | Test | Unit test script | 
|    long-signature-array.php | Test | Unit test script | 
|    long-with-hint.php | Test | Unit test script | 
|    longdef.php | Test | Unit test script | 
|    ma-inst.php | Test | Unit test script | 
|    multiline-concat.php | Test | Unit test script | 
|    namespaces.php | Test | Unit test script | 
|    opentag.php | Test | Unit test script | 
|    phpcf.php | Test | Unit test script | 
|    phpdoc.php | Test | Unit test script | 
|    several-times-apply.php | Test | Unit test script | 
|    short-array-ml.php | Test | Unit test script | 
|    short-array.php | Test | Unit test script | 
|    static.php | Test | Unit test script | 
|    switch-case.php | Test | Unit test script | 
|    ternary-ml.php | Test | Unit test script | 
|    ternary.php | Test | Unit test script | 
|    trait.php | Test | Unit test script | 
|    type-hint.php | Test | Unit test script | 
|    yield.php | Test | Unit test script | 
|  Files (157) | / | phpcf-src | / | test | / | functional_dirty | 
| File | Role | Description | 
|---|---|---|
|    Test_after_commit.php | Test | Unit test script | 
|    Test_dirty.php | Test | Unit test script | 
|    Test_new_branch_formatted.php | Test | Unit test script | 
|    Test_new_commit.php | Test | Unit test script | 
|  Files (157) | / | phpcf-src | / | test | / | original | 
| File | Role | Description | 
|---|---|---|
|    alignment.php | Test | Unit test script | 
|    anonymous.php | Test | Unit test script | 
|    binary-operators.php | Test | Unit test script | 
|    brace-after-comma.php | Test | Unit test script | 
|    broken-switch.php | Test | Unit test script | 
|    class-comm.php | Test | Unit test script | 
|    classref-function.php | Test | Unit test script | 
|    classref.php | Test | Unit test script | 
|    close-tag-safe1.php | Test | Unit test script | 
|    close-tag-safe2.php | Test | Unit test script | 
|    close-tag-safe3.php | Test | Unit test script | 
|    close-tag-unsafe1.php | Test | Unit test script | 
|    closure.php | Test | Unit test script | 
|    comments.php | Test | Unit test script | 
|    const-comment.php | Test | Unit test script | 
|    const-nl.php | Test | Unit test script | 
|    cyrillic.php | Test | Unit test script | 
|    declare.php | Test | Unit test script | 
|    deref.php | Test | Unit test script | 
|    empty-call.php | Test | Unit test script | 
|    empty-method.php | Test | Unit test script | 
|    empty-while-foreach.php | Test | Unit test script | 
|    end-space.php | Test | Unit test script | 
|    expression-static-call.php | Test | Unit test script | 
|    finally.php | Test | Unit test script | 
|    function-name.php | Test | Unit test script | 
|    heredoc.php | Test | Unit test script | 
|    if-comment.php | Test | Unit test script | 
|    if.php | Test | Unit test script | 
|    implements.php | Test | Unit test script | 
|    increment.php | Test | Unit test script | 
|    instanceof.php | Test | Unit test script | 
|    long-arr.php | Test | Unit test script | 
|    long-classdef.php | Test | Unit test script | 
|    long-expr.php | Test | Unit test script | 
|    long-params.php | Test | Unit test script | 
|    long-signature-array.php | Test | Unit test script | 
|    long-with-hint.php | Test | Unit test script | 
|    longdef.php | Test | Unit test script | 
|    ma-inst.php | Test | Unit test script | 
|    multiline-concat.php | Test | Unit test script | 
|    namespaces.php | Test | Unit test script | 
|    opentag.php | Test | Unit test script | 
|    phpcf.php | Test | Unit test script | 
|    phpdoc.php | Test | Unit test script | 
|    several-times-apply.php | Test | Unit test script | 
|    short-array-ml.php | Test | Unit test script | 
|    short-array.php | Test | Unit test script | 
|    static.php | Test | Unit test script | 
|    switch-case.php | Test | Unit test script | 
|    ternary-ml.php | Test | Unit test script | 
|    ternary.php | Test | Unit test script | 
|    trait.php | Test | Unit test script | 
|    type-hint.php | Test | Unit test script | 
|    yield.php | Test | Unit test script | 
| The PHP Classes site has supported package installation using the Composer tool since 2013, as you may verify by reading this instructions page. | 
|  Install with Composer | 
| Version Control | Unique User Downloads | Download Rankings | |||||||||||||||
| 100% | 
 | 
 | 
| Applications that use this package | 
 If you know an application of this package, send a message to the author to add a link here.
 If you know an application of this package, send a message to the author to add a link here.
| Related pages | 
| Github repo with summary |