A set of custom fixers for PHP CS Fixer.
PHP CS Fixer: custom fixers can be installed by running:
composer require --dev kubawerlos/php-cs-fixer-custom-fixersIn your PHP CS Fixer configuration register fixers and use them:
<?php return PhpCsFixer\Config::create() + ->registerCustomFixers(new PhpCsFixerCustomFixers\Fixers()) ->setRules([ '@PSR2' => true, 'array_syntax' => ['syntax' => 'short'], + PhpCsFixerCustomFixers\Fixer\NoLeadingSlashInGlobalNamespaceFixer::name() => true, + PhpCsFixerCustomFixers\Fixer\PhpdocNoSuperfluousParamFixer::name() => true, ]);Comment must be surrounded by spaces.
<?php -/*foo*/ +/* foo */Configured functions must be commented out. Risky: when any of the configured functions has side effects or is overridden. Configuration options:
functions(array): list of functions to comment out; defaults to['print_r', 'var_dump', 'var_export']
<?php -var_dump($x); +//var_dump($x);Name of data provider that is used only once must match name of test. Risky: when relying on name of data provider function. Configuration options:
prefix(string): prefix that replaces "test"; defaults to'provide'suffix(string): suffix to be added at the end"; defaults to'Cases'
<?php class FooTest extends TestCase { /** - * @dataProvider dataProvider + * @dataProvider provideHappyPathCases */ public function testHappyPath() {} - public function dataProvider() {} + public function provideHappyPathCases() {} }Return type of data provider must be iterable. Risky: when relying on signature of data provider.
<?php class FooTest extends TestCase { /** * @dataProvider provideHappyPathCases */ public function testHappyPath() {} - public function provideHappyPathCases(): array {} + public function provideHappyPathCases(): iterable {} }Data provider must be static.
<?php class FooTest extends TestCase { /** * @dataProvider provideHappyPathCases */ public function testHappyPath() {} - public function provideHappyPathCases() {} + public static function provideHappyPathCases() {} }Class defined internally by an extension, or the core should be called using the correct casing.
<?php -$foo = new STDClass(); +$foo = new stdClass();Multiline comment/PHPDoc must have opening and closing line without any extra content.
<?php -/** Hello +/** + * Hello * World! */;There should be no commented out code.
<?php -//var_dump($_POST); print_r($_POST);There must be no comment generated by Doctrine Migrations.
<?php namespace Migrations; use Doctrine\DBAL\Schema\Schema; -/** - * Auto-generated Migration: Please modify to your needs! - */ final class Version20180609123456 extends AbstractMigration { public function up(Schema $schema) { - // this up() migration is auto-generated, please modify it to your needs $this->addSql("UPDATE t1 SET col1 = col1 + 1"); } public function down(Schema $schema) { - // this down() migration is auto-generated, please modify it to your needs $this->addSql("UPDATE t1 SET col1 = col1 - 1"); } }Duplicated array keys must be removed.
<?php $x = [ - "foo" => 1, "bar" => 2, "foo" => 3, ];Duplicated use statements must be removed.
<?php namespace FooBar; use Foo; -use Foo; use Bar;There must be no import from global namespace.
<?php namespace Foo; -use DateTime; class Bar { - public function __construct(DateTime $dateTime) {} + public function __construct(\DateTime $dateTime) {} }When in global namespace there must be no leading slash for class.
<?php -$x = new \Foo(); +$x = new Foo(); namespace Bar; $y = new \Baz();There must be no nullable boolean type. Risky: when the null is used.
<?php -function foo(?bool $bar) : ?bool +function foo(bool $bar) : bool { return $bar; }There must be no comment generated by PhpStorm.
<?php -/** - * Created by PhpStorm. - * User: root - * Date: 01.01.70 - * Time: 12:00 - */ namespace Foo;There must be no reference in function definition. Risky: when rely on reference.
<?php -function foo(&$x) {} +function foo($x) {}There should not be superfluous inline concatenation of strings. Configuration options:
allow_preventing_trailing_spaces(bool): whether to keep concatenation if it prevents having trailing spaces in string; defaults tofalse
<?php -echo 'foo' . 'bar'; +echo 'foobar';There must be no comment like "Class Foo".
<?php /** - * Class Foo * Class to do something */ class Foo { /** - * Get bar */ function getBar() {} }There must be no comment generated by the Doctrine ORM.
<?php -/** - * FooRepository - * - * This class was generated by the Doctrine ORM. Add your own custom - * repository methods below. - */ class FooRepository extends EntityRepository {}There must be no useless parenthesis.
<?php -foo(($bar)); +foo($bar);Function sprintf without parameters should not be used. Risky: when the function sprintf is overridden.
<?php -$foo = sprintf('Foo'); +$foo = 'Foo';Function strlen (or mb_strlen) should not be used when compared to 0. Risky: when the function strlen is overridden.
<?php -$isEmpty = strlen($string) === 0; -$isNotEmpty = strlen($string) > 0; +$isEmpty = $string === ''; +$isNotEmpty = $string !== '';Numeric literals must have configured separators. Configuration options:
binary(bool,null): whether add, remove or ignore separators in binary numbers.; defaults tofalsedecimal(bool,null): whether add, remove or ignore separators in decimal numbers.; defaults tofalsefloat(bool,null): whether add, remove or ignore separators in float numbers.; defaults tofalsehexadecimal(bool,null): whether add, remove or ignore separators in hexadecimal numbers.; defaults tofalseoctal(bool,null): whether add, remove or ignore separators in octal numbers.; defaults tofalse
<?php -echo 0b01010100_01101000; // binary -echo 135_798_642; // decimal -echo 1_234.456_78e-4_321; // float -echo 0xAE_B0_42_FC; // hexadecimal -echo 0123_4567; // octal +echo 0b0101010001101000; // binary +echo 135798642; // decimal +echo 1234.45678e-4321; // float +echo 0xAEB042FC; // hexadecimal +echo 01234567; // octalOperators must always be at the beginning or at the end of the line. To be deprecated after this is merged and released. Configuration options:
only_booleans(bool): whether to limit operators to only boolean ones; defaults tofalseposition('beginning','end'): whether to place operators at the beginning or at the end of the line; defaults to'beginning'
<?php function foo() { - return $bar || - $baz; + return $bar + || $baz; }PHPUnit's functions fail, markTestIncomplete and markTestSkipped should not be followed directly by return. Risky: when PHPUnit's native methods are overridden.
<?php class FooTest extends TestCase { public function testFoo() { $this->markTestSkipped(); - return; } }@var must be correct in the code.
<?php -/** @var Foo $foo */ $bar = new Foo();There must be no superfluous parameters in PHPDoc.
<?php /** * @param bool $b - * @param int $i * @param string $s this is string - * @param string $s duplicated */ function foo($b, $s) {}Only listed annotations can be in PHPDoc. Configuration options:
elements(array): list of annotations to keep in PHPDoc; defaults to[]
<?php /** * @author John Doe - * @package foo - * @subpackage bar * @version 1.0 */ function foo_bar() {}@param annotations must be in the same order as function's parameters.
<?php /** + * @param int $a * @param int $b - * @param int $a * @param int $c */ function foo($a, $b, $c) {}@param must have type.
<?php /** * @param string $foo - * @param $bar + * @param mixed $bar */ function a($foo, $bar) {}In PHPDoc inside class or interface element self should be preferred over the class name itself.
<?php class Foo { /** - * @var Foo + * @var self */ private $instance; }@var annotation must be in single line when is the only content.
<?php class Foo { - /** - * @var string - */ + /** @var string */ private $name; }PHPDoc types must be trimmed.
<?php /** - * @param null | string $x + * @param null|string $x */ function foo($x) {}Single space must follow - not followed by semicolon - statement. Configuration options:
allow_linebreak(bool): whether to allow statement followed by linebreak; defaults tofalse
<?php -$foo = new Foo(); -echo$foo->__toString(); +$foo = new Foo(); +echo $foo->__toString();Single space must precede - not preceded by linebreak - statement.
<?php -$foo =new Foo(); +$foo = new Foo();Request feature or report bug by creating issue.
Alternatively, fork the repo, develop your changes, regenerate README.md:
php ./dev-tools/readme > ./README.mdmake sure all checks pass:
./dev-tools/check_file_permissions.sh ./dev-tools/check_trailing_whitespaces.sh composer verify composer infectionand submit pull request.