Tiện ích mở rộng phpstan

Trong trường hợp bạn đang gặp lỗi hoặc muốn yêu cầu một tính năng mới, hãy truy cập trình theo dõi vấn đề monorepo của Symplify

Đóng góp

Các nguồn của gói này được chứa trong Symplify monorepo. Chúng tôi hoan nghênh những đóng góp cho gói này trên symplify/symplify

Một trong các tính năng đầu tiên của Phpstan 0. 9 là sự ra đời của các loại giao điểm. Vì đây là một tính năng rất hữu ích giúp chúng tôi hiểu mã tốt hơn nhiều, nhưng thuật ngữ này phần lớn chưa được biết đến và bí ẩn đối với cộng đồng PHP, tôi quyết định viết và so sánh hai loại hợp chất này

Các loại công đoàn

  • Được viết là
    /**
    * @param Collection|Foo[] $object
    */

    public function doSomethingUseful[$object]
    {
    foreach [$object as $foo] {
    // $foo is Foo here
    }
    }
    2. Cú pháp chung được sử dụng trong PHPDOC trong nhiều năm
  • Nó có nghĩa là biến loại là foo hoặc thanh
  • Khi một hàm chấp nhận
    /**
    * @param Collection|Foo[] $object
    */

    public function doSomethingUseful[$object]
    {
    foreach [$object as $foo] {
    // $foo is Foo here
    }
    }
    2 như một đối số, điều đó có nghĩa là chỉ các thuộc tính và phương thức có sẵn trên cả FOO và BAR mới có thể được truy cập một cách an toàn trên biến. If FOO has
    /**
    * @param Collection|Foo[] $object
    */

    public function doSomethingUseful[$object]
    {
    foreach [$object as $foo] {
    // $foo is Foo here
    }
    }
    4, you only can access if thanh có cùng một thuộc tính
  • Nó rất nguy hiểm khi chuyển giá trị của loại
    /**
    * @param Collection|Foo[] $object
    */

    public function doSomethingUseful[$object]
    {
    foreach [$object as $foo] {
    // $foo is Foo here
    }
    }
    2 cho một hàm tham số trong đó chỉ cho phép FOO, bởi vì nếu nó thanh trong thời gian chạy, hàm được gọi là không chấp nhận nó
  • Nó rất tốt để chuyển giá trị của loại foo cho tham số hàm của loại
    /**
    * @param Collection|Foo[] $object
    */

    public function doSomethingUseful[$object]
    {
    foreach [$object as $foo] {
    // $foo is Foo here
    }
    }
    2, bởi vì FOO là một trong những tùy chọn được phép hơn

Cách phổ biến nhất để sử dụng các loại công đoàn là trong các đối số chức năng có khả năng chấp nhận nhiều loại khác nhau. Họ có thể được so sánh với ví dụ hoặc một nhà điều hành so sánh để cắt giảm các khả năng khi làm việc với họ

/**
* @param Foo|Bar $object
*/

public function doSomethingUseful[$object]
{
if [$object instanceof Foo] {
// now we can be sure that $object is just Foo in this branch
} elseif [$object instanceof Bar] {
// dtto for Bar
}
}

Đừng nhầm lẫn các loại liên minh với cách các nhà phát triển thường đánh dấu các loại vật phẩm trong một bộ sưu tập [mà thường là một trình lặp]

/**
* @param Collection|Foo[] $object
*/

public function doSomethingUseful[$object]
{
foreach [$object as $foo] {
// $foo is Foo here
}
}

Các loại giao điểm

  • Viết được là

    /**
    * @param Collection|Foo[] $object
    */

    public function doSomethingUseful[$object]
    {
    foreach [$object as $foo] {
    // $foo is Foo here
    }
    }
    0. Đây là một cú pháp rất lạ lùng được thấy một cách tự nhiên và nó thậm chí có thể không được IDE của bạn hỗ trợ. Đó là bởi vì khi mọi người viết
    /**
    * @param Collection|Foo[] $object
    */

    public function doSomethingUseful[$object]
    {
    foreach [$object as $foo] {
    // $foo is Foo here
    }
    }
    2, đôi khi họ có nghĩa là một loại công đoàn và đôi khi là một loại giao tiếp. Hãy hy vọng rằng điều này đã thay đổi trong những tháng và năm tiếp theo [không chỉ] nhờ Phpstan. Sự khác biệt giữa họ giúp mã hóa dễ hiểu hơn và cũng thân thiện hơn với các máy phân tích tĩnh có lợi cho mọi người
  • Nó có nghĩa là loại biến là foo và cùng một lúc

  • When a accept function

    /**
    * @param Collection|Foo[] $object
    */

    public function doSomethingUseful[$object]
    {
    foreach [$object as $foo] {
    // $foo is Foo here
    }
    }
    0 làm đối số, điều đó có nghĩa là các thuộc tính và phương thức từ một trong hai loại có thể được truy cập một cách an toàn. Bạn có thể truy cập các thuộc tính và phương thức gọi từ foo ngay cả khi chúng không có trên thanh
  • Nó rất tốt để chuyển đổi giá trị của loại

    /**
    * @param Collection|Foo[] $object
    */

    public function doSomethingUseful[$object]
    {
    foreach [$object as $foo] {
    // $foo is Foo here
    }
    }
    0 for an number of foo type
  • Nó rất nguy hiểm khi chuyển giá trị của loại foo cho một loại tham số

    /**
    * @param Collection|Foo[] $object
    */

    public function doSomethingUseful[$object]
    {
    foreach [$object as $foo] {
    // $foo is Foo here
    }
    }
    0, bởi vì ai đó có thể truy cập vào một thuộc tính hoặc gọi một phương thức từ thanh

  • Nó rất tốt để chuyển đổi giá trị của loại

    /**
    * @param Collection|Foo[] $object
    */

    public function doSomethingUseful[$object]
    {
    foreach [$object as $foo] {
    // $foo is Foo here
    }
    }
    5 cho một tham số loại
    /**
    * @param Collection|Foo[] $object
    */

    public function doSomethingUseful[$object]
    {
    foreach [$object as $foo] {
    // $foo is Foo here
    }
    }
    0, loại Baz chỉ đơn giản là bị bỏ đi trong trường hợp này

Vấn đề là bạn đã tạo ra các loại giao điểm trong mã của bạn và thậm chí không nhận ra nó. Xem xét mã này

/**
* @param Collection|Foo[] $object
*/

public function doSomethingUseful[$object]
{
foreach [$object as $foo] {
// $foo is Foo here
}
}
4

Trường hợp sử dụng khác cho chúng là các đối tượng giả mạo trong các khung kiểm tra đơn vị, thường là PHPUNIT. Hãy suy nghĩ về nó. Bạn tạo một đối tượng và nó có thể gọi các phương thức trên đó từ cả hai phương thức cấu hình cụ thể và mô phỏng

/**
* @param Collection|Foo[] $object
*/

public function doSomethingUseful[$object]
{
foreach [$object as $foo] {
// $foo is Foo here
}
}
5

Bạn cũng có thể tận dụng các loại giao diện nếu bạn không muốn ràng buộc mã của mình với một lớp cụ thể, nhưng muốn đánh máy nhiều giao diện cùng một lúc. Ví dụ. nếu bạn muốn lặp lại một cách an toàn trên một đối tượng và đồng thời chuyển nó đến

/**
* @param Collection|Foo[] $object
*/

public function doSomethingUseful[$object]
{
foreach [$object as $foo] {
// $foo is Foo here
}
}
7, bạn có thể làm điều đó như thế này.
/**
* @param Collection|Foo[] $object
*/

public function doSomethingUseful[$object]
{
foreach [$object as $foo] {
// $foo is Foo here
}
}
1

Điều này thực sự tốt đẹp vì nó hỗ trợ thiết kế cơ sở mã của bạn với các giao diện nhỏ và đơn giản

Bạn có thích Phpstan và sử dụng nó mỗi ngày không? . Tôi thực sự đánh giá cao nó. Cân nhắc hỗ trợ phát triển thêm PHPStan trên GitHub. Tôi thực sự đánh giá cao nó

Chủ Đề