У меня есть несколько сотен ужасно зазубренных PHP-файлов со смешанными табуляциями и пробелами (и даже смешанными окончаниями строк, я полагаю), которые я бы хотел исправить с помощью PHP-CS-закрепитель v2 +.
Я настроил php-cs-fixer для своих нужд, и код очищается соответствующим образом — кроме отступа. Я попробовал минимальную конфигурацию, как показано ниже, чтобы определить проблему. Но я не могу получить исправление отступа:
return PhpCsFixer\Config::create()
->setRules([
'@PSR2' => true,
'indentation_type' => true,
'braces' => ['position_after_functions_and_oop_constructs' => 'same'],
])
->setIndent("\t")
->setLineEnding("\r\n")
В настоящее время я запускаю это на своем компьютере с Windows, используя следующую команду (здесь для одного файла):
php-cs-fixer.bat fix new_user.php --config /full/windowspath/to/php_cs.dist
На всякий случай сгенерированный файл php_cs.cache (который содержит фактически примененные правила в JSON) выглядит так:
{
"php": "5.6.31",
"version": "2.6.0:v2.6.0#5642a36a60c11cdd01488d192541a89bb44a4abf",
"rules": {
"blank_line_after_namespace": true,
"braces": {
"position_after_functions_and_oop_constructs": "same"},
"class_definition": true,
"elseif": true,
"function_declaration": true,
"indentation_type": true,
"line_ending": true,
"lowercase_constants": true,
"lowercase_keywords": true,
"method_argument_space": {
"ensure_fully_multiline": true
},
"no_break_comment": true,
"no_closing_tag": true,
"no_spaces_after_function_name": true,
"no_spaces_inside_parenthesis": true,
"no_trailing_whitespace": true,
"no_trailing_whitespace_in_comment": true,
"single_blank_line_at_eof": true,
"single_class_element_per_statement": {
"elements": ["property"]
},
"single_import_per_statement": true,
"single_line_after_imports": true,
"switch_case_semicolon_to_colon": true,
"switch_case_space": true,
"visibility_required": true,
"encoding": true,
"full_opening_tag": true
},
"hashes": {
"new_students.org_.php": -151826318
}
}
А вот пример плохо зарезервированного образца содержимого файла.
<?php
session_start();
include 'connect.php';
include 'functions.php';
$test= "abc";
$additional_studs = "";
if (date('m') == 12 and $term='SP') {
$yr_suffix = date('y') + 1;
} else {
$yr_suffix = date('y');
}function dup_stud($id, $conn)
{//...
}
$i = 0;
Меня больше всего раздражают такие строки $test="abc";
& include 'connect.php';
с одной или несколькими ведущими вкладками / пробелами, которые не имеют правильного отступа.
Я открыт для альтернативных подходов. Другие, должно быть, сталкивались с проблемами форматирования, как это раньше.
Я также попробовал NetBeans, который прекрасно форматирует исходный код, но утомительно открывать каждый файл вручную и применять форматирование источника с помощью ярлыка.
Вы должны использовать braces
закрепитель для принудительного отступа.
Тело каждой структуры ДОЛЖНО быть заключено в фигурные скобки. Брекеты должны быть правильно размещены. Тело скобок должно быть правильно с отступом.
indentation_type
просто обеспечивает согласованность.
Но так как оба фиксера уже включены в @PSR2
поэтому код должен быть исправлен правильно.
Смотрите соответствующие разделы в ПРОЧТИ МЕНЯ.
Используя ваш код php-cs-fixer 2.6 выдает следующий код
<?php
$test= "abc";
$additional_studs = "";
if (date('m') == 12 and $term='SP') {
$yr_suffix = date('y') + 1;
} else {
$yr_suffix = date('y');
}function dup_stud($id, $conn)
{//...
}
$i = 0;
где отступ только частично исправлен.
Я сократил его до кода ниже
<?php
echo "a";
echo "b";
echo "c";
Похоже, ошибка в php-cs-fixer.
Я отвечу на свой вопрос, основываясь на результатах, которые привели меня к решению.
В то время как форматирование в основном работало, улов для меня был отступом. Если были некоторые пробелы или символы табуляции, после исправления некоторые линии продолжали торчать.
Так как ни php-cs-fixer, ни phpcbf не смогли правильно исправить отступ, я принял отчаянные меры и обрезал каждый начальный пробел из каждой строки в качестве подготовительного шага с помощью sed в таком скрипте:
sed "s/^[ \t]*//" -i test.php
Затем я снова обработал некоторые предварительно подготовленные файлы с помощью php-cs-fixer и phpcbf, чтобы выяснить, какой из них лучше справляется с форматированием файлов в соответствии с PSR-2. Это позорно, но оба исправителя снова потерпели неудачу — теперь они показывают разные недостатки (то есть ошибки). Короче говоря, я наконец-то узнал, что объединение двух инструментов приводит к правильно отформатированным файлам кода. Что за беспорядок
Итак, после sed я запускаю phpcbf
phpcbf --standard="PSR2" test.php
с последующим
php-cs-fixer fix test.php --rules=@PSR2
И вдруг я прекрасно отформатировал PHP-файлы PSR-2. Не самый эффективный способ, но он делает свою работу.
Некоторые дополнительные комментарии:
ОП говорит
Я открыт для альтернативных подходов. Другие, должно быть, сталкивались с проблемами форматирования, как это раньше.
наш PHP Formatter будет делать отступы в файлах. Смотрите пример «плохо с отступом» OP, обработанный PHP Formatter:
C:\>DMSFormat PHP~v7 \temp\test.php
PHP~v7 PrettyPrinter Version 1.3.17
Copyright (C) 2004-2016 Semantic Designs, Inc; All Rights Reserved; SD Confidential
Powered by DMS (R) Software Reengineering Toolkit
DMS_PHP~v7_INPUT_ENCODING=ISO-8859-1
DMS_PHP~v7_OUTPUT_ENCODING=ISO-8859-1
Parsing \temp\test.php [encoding ISO-8859-1 +CRLF +LF +CR +NEL +1 /^I]<?php
include 'connect.php';
include 'functions.php';
$test="abc";
$additional_studs="";
if (date('m') == 12 and $term='SP') {
$yr_suffix=date('y')+1;
}
else {
$yr_suffix=date('y');
}
function dup_stud($id,$conn) { //...
}
$i=0;
(Пришлось добавить
<?php
в начало файла, чтобы сделать его легальным.)
Этот пример был запущен из файла в консоль. Вы также можете сделать один файл для одного файла или запустить весь список файлов, используя файл проекта [это, вероятно, то, что хочет OP].
Средство форматирования PHP использует настоящий синтаксический анализатор PHP для обработки исходного текста и построения абстрактного синтаксического дерева, а также специальный prettyprinter для печати AST обратно в красиво отформатированный текст. Он не может испортить файл.
Об альтернативных вариантах. У меня также была проблема с автоматическим форматированием кода в Visual Studio Code. Я пробовал некоторые форматеры, но только phpfmt решил мою проблему с отступом и установкой брекетов в нужном месте. У этого также есть много вариантов настройки, но я не проверял их, так как они не были необходимы.