ชุดของตัวแก้ไขที่กำหนดเองสำหรับ PHP CS Fixer
PHP CS Fixer: ตัวแก้ไขที่กำหนดเองสามารถติดตั้งได้โดยการรัน:
composer require --dev kubawerlos/php-cs-fixer-custom-fixersใน PHP CS Fixer Configuration Register Fixers และใช้งาน:
<?php
return (new PhpCsFixerConfig())
+ ->registerCustomFixers(new PhpCsFixerCustomFixersFixers())
->setRules([
'@PSR2' => true,
'array_syntax' => ['syntax' => 'short'],
+ PhpCsFixerCustomFixersFixerNoLeadingSlashInGlobalNamespaceFixer::name() => true,
+ PhpCsFixerCustomFixersFixerPhpdocNoSuperfluousParamFixer::name() => true,
]);php-cs-fixer/shim อาจจำเป็นต้องใช้ bootstrap เพื่อโหลดคลาส PhpCsFixerCustomFixers :
require __DIR__ . ' /vendor/kubawerlos/php-cs-fixer-custom-fixers/bootstrap.php ' ;ความคิดเห็นจะต้องถูกล้อมรอบด้วยช่องว่าง
<?php
- /*foo*/
+ /* foo */ ฟังก์ชั่นที่กำหนดค่าจะต้องแสดงความคิดเห็น ความเสี่ยง: เมื่อฟังก์ชั่นใด ๆ ที่กำหนดค่ามีผลข้างเคียงหรือถูกเขียนทับ ตัวเลือกการกำหนดค่า:
functions ( array ): รายการฟังก์ชั่นที่จะแสดงความคิดเห็น; ค่าเริ่มต้นเป็น ['print_r', 'var_dump', 'var_export'] <?php
- var_dump($x);
+ //var_dump($x); เครื่องมือจัดฟันที่ว่างเปล่าของ Constructor ต้องอยู่ในบรรทัดเดียว
<?php
class Foo {
public function __construct(
$param1,
$param2
- ) {
- }
+ ) {}
} ชื่อผู้ให้บริการข้อมูลจะต้องตรงกับชื่อของการทดสอบ เลิกใช้แล้ว: ใช้ php_unit_data_provider_name แทน ความเสี่ยง: เมื่อพึ่งพาชื่อฟังก์ชันผู้ให้บริการข้อมูล ตัวเลือกการกำหนดค่า:
prefix ( string ): คำนำหน้าที่แทนที่ "ทดสอบ"; ค่าเริ่มต้นเป็น 'provide'suffix ( string ): คำต่อท้ายที่จะเพิ่มในตอนท้าย "; ค่าเริ่มต้นเป็น 'Cases' <?php
class FooTest extends TestCase {
/**
- * @dataProvider dataProvider
+ * @dataProvider provideSomethingCases
*/
public function testSomething($expected, $actual) {}
- public function dataProvider() {}
+ public function provideSomethingCases() {}
} ประเภทการส่งคืนของผู้ให้บริการข้อมูล phpunit จะต้อง iterable เลิกใช้แล้ว: ใช้ php_unit_data_provider_return_type แทน ความเสี่ยง: เมื่อพึ่งพาลายเซ็นของผู้ให้บริการข้อมูล
<?php
class FooTest extends TestCase {
/**
* @dataProvider provideSomethingCases
*/
public function testSomething($expected, $actual) {}
- public function provideSomethingCases(): array {}
+ public function provideSomethingCases(): iterable {}
} ผู้ให้บริการข้อมูลจะต้องคงที่ เลิกใช้แล้ว: ใช้ php_unit_data_provider_static แทน ความเสี่ยง: เมื่อกำลังตั้ง force เป็น true ตัวเลือกการกำหนดค่า:
force ( bool ): จะทำให้ผู้ให้บริการข้อมูลแบบคงที่มีการโทรแบบไดนามิกหรือไม่ ค่าเริ่มต้นเป็น false <?php
class FooTest extends TestCase {
/**
* @dataProvider provideSomethingCases
*/
public function testSomething($expected, $actual) {}
- public function provideSomethingCases() {}
+ public static function provideSomethingCases() {}
}ประกาศคำสั่งสำหรับประเภทที่เข้มงวดจะต้องอยู่ในบรรทัดเดียวกันหลังจากแท็กเปิด
- <?php
+ <?php declare(strict_types=1);
$foo;
- declare(strict_types=1);
$bar; ร่างกายฟังก์ชั่นที่ว่างเปล่าจะต้องย่อเป็น {} และวางไว้บนบรรทัดเดียวกับสัญลักษณ์ก่อนหน้าซึ่งคั่นด้วยพื้นที่
<?php function foo(
int $x
- )
- {
- }
+ ) {} คลาสที่กำหนดภายในโดยส่วนขยายหรือหลักจะต้องอ้างอิงด้วยกรณีที่ถูกต้อง เลิกใช้แล้ว: ใช้ class_reference_name_casing แทน
<?php
- $foo = new STDClass();
+ $foo = new stdClass(); ฟังก์ชั่น array_key_exists จะต้องใช้แทน isset เมื่อเป็นไปได้ ความเสี่ยง: เมื่อไม่ได้กำหนดอาร์เรย์จะมีหลายมิติหรือพฤติกรรมจะพึ่งพาค่า NULL
<?php
- if (isset($array[$key])) {
+ if (array_key_exists($key, $array)) {
echo $array[$key];
}ความคิดเห็นหลายอย่างหรือ PHPDOCs จะต้องมีสายเปิดและปิดโดยไม่มีเนื้อหาเพิ่มเติม
<?php
- /** Hello
+ /**
+ * Hello
* World!
*/คุณสมบัติที่ได้รับการส่งเสริมจะต้องอยู่ในบรรทัดที่แยกต่างหาก ตัวเลือกการกำหนดค่า:
keep_blank_lines ( bool ): ไม่ว่าจะเก็บเส้นที่ว่างเปล่าระหว่างคุณสมบัติหรือไม่ ค่าเริ่มต้นเป็น falseminimum_number_of_parameters ( int ): จำนวนขั้นต่ำของพารามิเตอร์ในตัวสร้างเพื่อแก้ไข; ค่าเริ่มต้นเป็น 1 <?php class Foo {
- public function __construct(private array $a, private bool $b, private int $i) {}
+ public function __construct(
+ private array $a,
+ private bool $b,
+ private int $i
+ ) {}
}จะต้องไม่มีรหัสแสดงความคิดเห็น
<?php
- //var_dump($_POST);
print_r($_POST);จะต้องไม่มีความคิดเห็นที่สร้างขึ้นโดยการอพยพหลักคำสอน
<?php
namespace Migrations;
use DoctrineDBALSchemaSchema;
- /**
- * 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");
}
}จะต้องไม่มีคีย์อาร์เรย์ที่ซ้ำกัน ตัวเลือกการกำหนดค่า:
ignore_expressions ( bool ): ไม่ว่าจะเป็นการแสดงออกที่ซ้ำกัน (เนื่องจากอาจส่งคืนค่าที่แตกต่างกัน) หรือไม่; ค่าเริ่มต้นเป็น true <?php
$x = [
- "foo" => 1,
"bar" => 2,
"foo" => 3,
]; จะต้องไม่มีคำสั่ง use ซ้ำ
<?php
namespace FooBar;
use Foo;
- use Foo;
use Bar;จะต้องไม่มีการนำเข้าจากเนมสเปซทั่วโลก
<?php
namespace Foo;
- use DateTime;
class Bar {
- public function __construct(DateTime $dateTime) {}
+ public function __construct(DateTime $dateTime) {}
}ชั้นเรียนในเนมสเปซทั่วโลกไม่สามารถมีสแลชชั้นนำได้
<?php
- $x = new Foo();
+ $x = new Foo();
namespace Bar;
$y = new Baz();จะต้องไม่มีประเภทบูลีนที่ไม่มีค่าใช้จ่าย มีความเสี่ยง: เมื่อใช้โมฆะ
<?php
- function foo(?bool $bar) : ?bool
+ function foo(bool $bar) : bool
{
return $bar;
}จะต้องไม่มีความคิดเห็นที่สร้างโดย phpstorm
<?php
- /**
- * Created by PhpStorm.
- * User: root
- * Date: 01.01.70
- * Time: 12:00
- */
namespace Foo;จะต้องไม่มีพารามิเตอร์ที่ส่งผ่านโดยการอ้างอิงในฟังก์ชั่น ความเสี่ยง: เมื่อพึ่งพาการอ้างอิง
<?php
- function foo(&$x) {}
+ function foo($x) {} จะต้องไม่มีการเชื่อมต่อที่ฟุ่มเฟือยของสตริงตัวอักษร ตัวเลือกการกำหนดค่า:
allow_preventing_trailing_spaces ( bool ): ไม่ว่าจะต่อการต่อกันหรือไม่หากมันป้องกันการมีช่องว่างต่อท้ายในสตริง; ค่าเริ่มต้นเป็น falsekeep_concatenation_for_different_quotes ( bool ): ไม่ว่าจะต่อการต่อเนื่องหากมีการจัดเรียงครั้งเดียวและแบบสองเท่าจะถูกต่อกันหรือไม่ ค่าเริ่มต้นเป็น false <?php
- echo 'foo' . 'bar';
+ echo 'foobar'; รายการองค์ประกอบที่เขียนในบรรทัดเดียวไม่สามารถมีเครื่องหมายจุลภาคต่อท้าย
<?php
- $x = ['foo', 'bar', ];
+ $x = ['foo', 'bar']; จะต้องไม่มีความคิดเห็นที่ไร้ประโยชน์
<?php
/**
- * Class Foo
* Class to do something
*/
class Foo {
/**
- * Get bar
*/
function getBar() {}
} จะต้องไม่มีการ dirname ที่ไร้ประโยชน์
<?php
- require dirname(__DIR__) . "/vendor/autoload.php";
+ require __DIR__ . "/../vendor/autoload.php"; ไม่มีความคิดเห็นที่สร้างขึ้นโดย Doctrine ORM
<?php
- /**
- * FooRepository
- *
- * This class was generated by the Doctrine ORM. Add your own custom
- * repository methods below.
- */
class FooRepository extends EntityRepository {}จะต้องไม่มีวงเล็บที่ไร้ประโยชน์
<?php
- foo(($bar));
+ foo($bar); ฟังก์ชั่น strlen และ mb_strlen จะต้องไม่เปรียบเทียบกับ 0. ความเสี่ยง: เมื่อฟังก์ชัน strlen ถูกแทนที่
<?php
- $isEmpty = strlen($string) === 0;
- $isNotEmpty = strlen($string) > 0;
+ $isEmpty = $string === '';
+ $isNotEmpty = $string !== ''; ตัวอักษรตัวเลขจะต้องมีตัวคั่นที่กำหนดค่า เลิกใช้แล้ว: ใช้ numeric_literal_separator แทน ตัวเลือกการกำหนดค่า:
binary ( bool , null ): ไม่ว่าจะเพิ่มลบหรือละเว้นตัวคั่นในหมายเลขไบนารี; ค่าเริ่มต้นเป็น falsedecimal ( bool , null ): ไม่ว่าจะเพิ่มลบหรือละเว้นตัวคั่นในตัวเลขทศนิยม; ค่าเริ่มต้นเป็น falsefloat ( bool , null ): ไม่ว่าจะเพิ่ม, ลบหรือละเว้นตัวคั่นในหมายเลขลอย; ค่าเริ่มต้นเป็น falsehexadecimal ( bool , null ): ไม่ว่าจะเพิ่มลบหรือละเว้นตัวคั่นในตัวเลขเลขฐานสิบหก; ค่าเริ่มต้นเป็น falseoctal ( bool , null ): ไม่ว่าจะเพิ่มลบหรือละเว้นตัวคั่นในหมายเลข octal; ค่าเริ่มต้นเป็น false <?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; // octal การยืนยัน PHPUNIT จะต้องมีข้อโต้แย้งที่คาดหวังก่อนที่จะเกิดขึ้นจริง ความเสี่ยง: เมื่อวิธีการ phpunit ดั้งเดิมถูกเขียนทับ
<?php
class FooTest extends TestCase {
public function testFoo() {
- self::assertSame($value, 10);
+ self::assertSame(10, $value);
}
} การยืนยัน PHPUNIT เช่น assertCount และ assertInstanceOf จะต้องใช้มากกว่า assertEquals / assertSame ความเสี่ยง: เมื่อวิธีการ phpunit ดั้งเดิมถูกเขียนทับ
<?php
class FooTest extends TestCase {
public function testFoo() {
- self::assertSame($size, count($elements));
- self::assertSame($className, get_class($object));
+ self::assertCount($size, $elements);
+ self::assertInstanceOf($className, $object);
}
} phpunit fail , markTestIncomplete และ markTestSkipped ฟังก์ชั่นจะต้องไม่ถูกติดตามโดยตรงด้วย return ความเสี่ยง: เมื่อวิธีการ phpunit ดั้งเดิมถูกเขียนทับ
<?php
class FooTest extends TestCase {
public function testFoo() {
$this->markTestSkipped();
- return;
}
} ควรใช้สไตล์อาร์เรย์ทั่วไปใน PHPDOC เลิกใช้แล้ว: ใช้ phpdoc_array_type แทน
<?php
/**
- * @return int[]
+ * @return array<int>
*/
function foo() { return [1, 2]; } ต้องใช้คำอธิบายประกอบ @var อย่างถูกต้องในรหัส
<?php
- /** @var Foo $foo */
$bar = new Foo();จะต้องไม่มีพารามิเตอร์ที่ฟุ่มเฟือยใน PHPDOC
<?php
/**
* @param bool $b
- * @param int $i
* @param string $s this is string
- * @param string $s duplicated
*/
function foo($b, $s) {}อนุญาตให้ใช้คำอธิบายประกอบที่ระบุไว้ใน PHPDOC เท่านั้น ตัวเลือกการกำหนดค่า:
elements ( array ): รายการคำอธิบายประกอบที่จะเก็บไว้ใน phpDoc; ค่าเริ่มต้นเป็น [] <?php
/**
* @author John Doe
- * @package foo
- * @subpackage bar
* @version 1.0
*/
function foo_bar() {} คำสั่งซื้อคำอธิบายประกอบ @param ทั้งหมดใน docblocks ตามลายเซ็นของวิธี เลิกใช้แล้ว: ใช้ phpdoc_param_order แทน
<?php
/**
+ * @param int $a
* @param int $b
- * @param int $a
* @param int $c
*/
function foo($a, $b, $c) {} คำอธิบายประกอบ @param ต้องมีประเภท
<?php
/**
* @param string $foo
- * @param $bar
+ * @param mixed $bar
*/
function a($foo, $bar) {} ใน PHPDOC ต้องใช้ self คลาสหรือองค์ประกอบอินเตอร์เฟสแทนชื่อคลาสเอง
<?php
class Foo {
/**
- * @var Foo
+ * @var self
*/
private $instance;
} คำอธิบายประกอบ @var จะต้องอยู่ในบรรทัดเดียวหากเป็นเนื้อหาเดียว
<?php
class Foo {
- /**
- * @var string
- */
+ /** @var string */
private $name;
} ต้องใช้ list ประเภท PHPDOC แทน array โดยไม่มีประเภทคีย์ เลิกใช้แล้ว: ใช้ phpdoc_list_type แทน
<?php
/**
- * @param array<string>
+ * @param list<string>
*/
function foo($x) {}Commas ประเภท PHPDOC จะต้องไม่ถูกนำหน้าด้วยช่องว่างและจะต้องประสบความสำเร็จโดยช่องว่างเดียว
- <?php /** @var array<int,string> */
+ <?php /** @var array<int, string> */ ประเภท PHPDOC จะต้องถูกตัดแต่ง
<?php
/**
- * @param null | string $x
+ * @param null|string $x
*/
function foo($x) {} แปลงคำอธิบายประกอบ @var เพื่อ assert การโทรเมื่อใช้ในการมอบหมาย
<?php
- /** @var string $x */
$x = getValue();
+ assert(is_string($x)); คุณสมบัติของตัวสร้างจะต้องได้รับการส่งเสริมหากเป็นไปได้ ตัวเลือกการกำหนดค่า:
promote_only_existing_properties ( bool ): จะส่งเสริมคุณสมบัติเฉพาะที่กำหนดไว้ในชั้นเรียนหรือไม่ ค่าเริ่มต้นเป็น false <?php
class Foo {
- private string $bar;
- public function __construct(string $bar) {
- $this->bar = $bar;
+ public function __construct(private string $bar) {
}
}คุณสมบัติที่ได้รับการส่งเสริมจะต้องประกาศว่าเป็นการอ่านอย่างเดียว มีความเสี่ยง: เมื่อเขียนทรัพย์สิน
<?php class Foo {
public function __construct(
- public array $a,
- public bool $b,
+ public readonly array $a,
+ public readonly bool $b,
) {}
}ข้อความที่ไม่ได้ตามด้วยอัฒภาคต้องตามด้วยพื้นที่เดียว ตัวเลือกการกำหนดค่า:
allow_linebreak ( bool ): ไม่ว่าจะอนุญาตคำสั่งตามด้วย lineBreak; ค่าเริ่มต้นเป็น false <?php
- $foo = new Foo();
- echo$foo->bar();
+ $foo = new Foo();
+ echo $foo->bar(); ข้อความที่ไม่ได้นำหน้าด้วยการแบ่งบรรทัดจะต้องนำหน้าด้วยพื้นที่เดียว
<?php
- $foo =new Foo();
+ $foo = new Foo(); คลาสที่ใช้เมธอด __toString() จะต้องใช้อินเทอร์เฟซ Stringable
<?php
- class Foo
+ class Foo implements Stringable
{
public function __toString()
{
return "Foo";
}
}ขอคุณสมบัติหรือรายงานข้อผิดพลาดโดยการสร้างปัญหา
อีกทางเลือกหนึ่งแยกที่เก็บการเปลี่ยนแปลงของคุณและตรวจสอบให้แน่ใจว่าทุกอย่างเรียบร้อยดี:
composer verifyและส่งคำขอดึง