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à
2. Cú pháp chung được sử dụng trong PHPDOC trong nhiều năm/**
* @param Collection|Foo[] $object
*/
public function doSomethingUseful[$object]
{
foreach [$object as $foo] {
// $foo is Foo here
}
} - Nó có nghĩa là biến loại là foo hoặc thanh
- Khi một hàm chấp nhận
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/**
* @param Collection|Foo[] $object
*/
public function doSomethingUseful[$object]
{
foreach [$object as $foo] {
// $foo is Foo here
}
} - Nó rất nguy hiểm khi chuyển giá trị của loại
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ó/**
* @param Collection|Foo[] $object
*/
public function doSomethingUseful[$object]
{
foreach [$object as $foo] {
// $foo is Foo here
}
} - Nó rất tốt để chuyển giá trị của loại foo cho tham số hàm của loại
2, bởi vì FOO là một trong những tùy chọn được phép hơn/**
* @param Collection|Foo[] $object
*/
public function doSomethingUseful[$object]
{
foreach [$object as $foo] {
// $foo is Foo here
}
}
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à
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/**
* @param Collection|Foo[] $object
*/
public function doSomethingUseful[$object]
{
foreach [$object as $foo] {
// $foo is Foo here
}
}Nó có nghĩa là loại biến là foo và cùng một lúc
When a accept function
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/**
* @param Collection|Foo[] $object
*/
public function doSomethingUseful[$object]
{
foreach [$object as $foo] {
// $foo is Foo here
}
}Nó rất tốt để chuyển đổi giá trị của loại
0 for an number of foo type/**
* @param Collection|Foo[] $object
*/
public function doSomethingUseful[$object]
{
foreach [$object as $foo] {
// $foo is Foo here
}
}Nó rất nguy hiểm khi chuyển giá trị của loại foo cho một loại tham số
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/**
* @param Collection|Foo[] $object
*/
public function doSomethingUseful[$object]
{
foreach [$object as $foo] {
// $foo is Foo here
}
}Nó rất tốt để chuyển đổi giá trị của loại
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/**
* @param Collection|Foo[] $object
*/
public function doSomethingUseful[$object]
{
foreach [$object as $foo] {
// $foo is Foo here
}
}
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
}
}
4Trườ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
}
}
5Bạ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ó