phpcf
Форматер был Ñоздан Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы в оÑновном менÑÑ‚ÑŒ пробельные Ñимволы: переноÑÑ‹ Ñтрок, отÑтупы, пробелы вокруг операторов, и Ñ‚.д. Таким образом, 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), но зато умеет перепиÑывать токены.