Kiểu trả về chữ ký hàm PHP

PHPStan 1. 6. 0 đã được phát triển trong khoảng một tháng qua mang đến một số lượng tính năng và cải tiến mới đáng ngạc nhiên. Hãy đi sâu vào chúng

Các loại trả về có điều kiện

Phần lớn tính năng này được phát triển bởi Richard van Velzen

Kể từ lần phát hành đầu tiên, PHPStan đã đưa ra một cách để mô tả các hàm trả về các kiểu khác nhau dựa trên các đối số được truyền trong lệnh gọi. Cái gọi là tiện ích mở rộng loại trả về động thực sự linh hoạt - bạn có thể giải quyết loại dựa trên bất kỳ logic nào bạn có thể triển khai. Nhưng nó có cái giá của nó - có một lộ trình học tập về các khái niệm cốt lõi của việc viết các phần mở rộng PHPStan

Trong PHPStan 0. 12 đến thuốc generic. Chúng bao gồm một phần các kịch bản với cú pháp PHPDoc đặc biệt trong đó cần có các phần mở rộng kiểu trả về động với logic tùy chỉnh trước đây

Hôm nay PHPStan tiến thêm một bước trong khả năng truy cập các tính năng nâng cao này. Bạn không còn phải là một chuyên gia để tận dụng chúng. Thật thú vị, ai đó thậm chí có thể gọi đây là những giải pháp “không mã” 🤣

Các kiểu trả về có điều kiện cho phép bạn viết logic “if-else” trong thẻ PHPDoc @return

Các loại trả về có điều kiện có thể được kết hợp với thuốc generic

Loại mẫu chung cũng có thể được sử dụng bên trong điều kiện

Các điều kiện phức tạp hơn có thể được thể hiện bằng cách lồng các loại điều kiện

mặt nạ số nguyên

Tính năng này được phát triển bởi Richard van Velzen

Một mẫu phổ biến để định cấu hình hành vi của hàm là chấp nhận một giá trị số nguyên bao gồm các cờ khác nhau được nối với toán tử |

echo json_encode($a, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE);

Để mẫu này hoạt động, mỗi giá trị này phải là một giá trị lũy thừa hai riêng biệt (1, 2, 4, 8,…)

Bây giờ bạn có thể sử dụng cái này trong PHPStan

Ngoài ra còn có biến thể int-mask-of<...> chấp nhận loại hợp nhất của các giá trị số nguyên thay vì các giá trị được phân tách bằng dấu phẩy

Tiêu thụ bộ nhớ thấp hơn

PHPStan đã từng là một con thú thực sự đói ăn. Đến mức bị giết một cách dã man bởi những người chạy CI vì nó tiêu tốn không chỉ toàn bộ bộ nhớ lên tới memory_limit trong php. ini, mà còn tất cả bộ nhớ được gán cho phần cứng của người chạy

Bây giờ nó là một con thú ít đói hơn. Làm thế nào tôi làm cho nó xảy ra? . Bạn có thể tiêu thụ bộ nhớ khi đạt được những điều hữu ích, nhưng để tiêu thụ ít bộ nhớ hơn về tổng thể, bộ nhớ phải được giải phóng sau đó để có thể sử dụng lại cho các dữ liệu khác nhau cần thiết khi phân tích tệp tiếp theo trong dòng

Để gỡ lỗi rò rỉ bộ nhớ, tôi sử dụng tiện ích mở rộng php-meminfo. Nó xuất tất cả các giá trị vô hướng và các đối tượng được lưu trong bộ nhớ sang tệp JSON. Nó cũng đi kèm với một bộ phân tích tạo ra các số liệu thống kê khác nhau để bạn biết mình nên bắt đầu tối ưu hóa từ đâu

Tôi nhanh chóng nhận ra rằng phần lớn bộ nhớ bị chiếm bởi các nút AST. PHP giải phóng bộ nhớ bị chiếm bởi một đối tượng khi không còn tham chiếu đến nó nữa. Nó không hoạt động trong trường hợp các nút AST vì chúng liên tục chỉ vào nhau

Chắc chắn rồi, cũng có bộ thu gom rác thu thập các chu kỳ như thế này. Nhưng PHPStan đã có nó vì nó cải thiện hiệu suất theo thời gian. Khi có nhiều chu kỳ, các ứng dụng chưa được gọi là gc_disable() đang tiêu tốn rất nhiều thời gian của CPU

Bởi vì việc loại bỏ các thuộc tính nút parent/

includes:
- vendor/phpstan/phpstan/conf/bleedingEdge.neon
0/
includes:
- vendor/phpstan/phpstan/conf/bleedingEdge.neon
1 là một sự phá vỡ khả năng tương thích ngược đối với các quy tắc tùy chỉnh đọc chúng, tôi chỉ làm điều đó khi cấu hình Bleeding Edge được bật. Tôi đã viết một bài viết về cách làm cho các quy tắc này hoạt động trở lại ngay cả khi không có các tham chiếu tiêu tốn bộ nhớ đó

Một thay đổi thú vị trong tất cả những điều này là việc loại bỏ cuộc gọi gc_disable() không còn thể hiện một hình phạt đáng kể về hiệu suất ở đây nên nó không còn được sử dụng nữa

Trong thử nghiệm của tôi, PHPStan hiện tiêu thụ bộ nhớ ít hơn khoảng 50–70 % khi bật Bleeding Edge

Bạn có thể kích hoạt Bleeding Edge bằng cách đưa cái này vào

includes:
- vendor/phpstan/phpstan/conf/bleedingEdge.neon
3 của bạn

includes:
- vendor/phpstan/phpstan/conf/bleedingEdge.neon

Phản xạ hoàn toàn tĩnh

Vào tháng 6 năm 2020, tôi đã phát hành PHPStan 0. 12. 26 với phản xạ tĩnh một phần mang lại nhiều lợi ích cho người dùng

Nó chỉ là một phần vì phiên bản đầy đủ tiêu tốn nhiều tài nguyên hơn. Là một phần của việc tối ưu hóa mức tiêu thụ bộ nhớ, tôi đã viết lại các phần của BetterReflection để nó không giữ các nút AST khi không cần chúng nữa. Tôi đã mô tả quá trình ở đây

Trong thử nghiệm, nó trông thực sự hứa hẹn, sự khác biệt về hiệu suất giữa thời gian chạy và phản xạ tĩnh là không đáng kể. Vì vậy, tôi quyết định đã đến lúc thực hiện bước tiếp theo. bắt đầu triển khai công cụ phản chiếu tĩnh 100%. Nó đã giải quyết các trường hợp cạnh khác nhau như thế này hoặc thế này

Nó hiện là một phần của Bleting Edge và kế hoạch của tôi là kích hoạt nó cho mọi người trong PHPStan 1. x ngay cả trước phiên bản chính tiếp theo. Đây là đợt triển khai theo từng giai đoạn để tôi có thể thu thập và xử lý phản hồi từ những người dùng đầu tiên trước khi triển khai cho những người khác

Làm cho các toán tử kết hợp includes: - vendor/phpstan/phpstan/conf/bleedingEdge.neon4 và null (includes: - vendor/phpstan/phpstan/conf/bleedingEdge.neon5) nhất quán đối với các thuộc tính không xác định

Tính năng này được phát triển bởi Yohta Kimura

Trong nhiều năm, PHPStan đã phải chịu đựng sự mâu thuẫn rõ ràng này

Mặc dù hai dòng trong câu hỏi tương đương về mặt chức năng, nhưng hành vi của PHPStan không phản ánh điều đó. Mục đích là để PHPStan bảo vệ người dùng khỏi lỗi chính tả trong tên thuộc tính, nhưng nó đã được chứng minh là gây khó chịu hơn là hữu ích đối với hầu hết

Hành vi mặc định mới là

Nhưng nếu bạn muốn hành vi chặt chẽ hơn và cả hai dòng đều báo lỗi (cuối cùng là nhất quán), bạn có thể bật nó bằng tùy chọn này trong

includes:
- vendor/phpstan/phpstan/conf/bleedingEdge.neon
3 của mình

________số 8_______

Điều này cũng được kích hoạt trong

includes:
- vendor/phpstan/phpstan/conf/bleedingEdge.neon
7 1. 2. 0 khi kết hợp với Bleeding Edge

Hỗ trợ đầy đủ PHP 8. 1

Trước PHPStan 1. x đã hỗ trợ nhiều thay đổi và tính năng mới được tạo trong PHP 8. 1. Điều cuối cùng mà PHPStan không biết là các chữ ký đã thay đổi của các hàm PHP tích hợp. Đáng chú ý nhất là

includes:
- vendor/phpstan/phpstan/conf/bleedingEdge.neon
8 đã đạt được một tham số tùy chọn mới và

Kể từ PHP 8. 0 PHPStan sử dụng kho lưu trữ sơ khai cây nhà lá vườn được trích xuất trực tiếp từ php-src - Tôi có thể tin rằng chúng là chính xác, nhưng tôi phải tìm cách đại diện cho PHP 8. 1 thay đổi mà không tăng gấp đôi kích thước kho lưu trữ. Tôi đã quyết định sử dụng các thuộc tính

includes:
- vendor/phpstan/phpstan/conf/bleedingEdge.neon
9 và
parameters:
checkDynamicProperties: true
0 tùy chỉnh để đánh dấu các chữ ký đã thay đổi


Bạn có thích PHPStan và sử dụng nó hàng ngày không? . Tôi thực sự đánh giá cao nó

Làm cách nào để đặt kiểu trả về của hàm trong PHP?

Khai báo kiểu trả về PHP . Để khai báo kiểu trả về của hàm, hãy thêm dấu hai chấm (. ) và nhập ngay trước dấu ngoặc nhọn ( { ) khi khai báo hàm .

Làm cách nào để trả về kiểu dữ liệu trong PHP?

Hàm gettype() trả về loại biến.

Làm cách nào để trả về giá trị từ hàm PHP?

Các giá trị được trả về bằng cách sử dụng câu lệnh trả về tùy chọn . Bất kỳ loại nào cũng có thể được trả về, bao gồm cả mảng và đối tượng. Điều này làm cho chức năng kết thúc thực thi ngay lập tức và chuyển quyền điều khiển trở lại dòng mà nó được gọi.

Làm cách nào để lặp lại giá trị trả về của hàm trong PHP?

Hàm echo() xuất ra một hoặc nhiều chuỗi . Ghi chú. Hàm echo() không thực sự là một hàm, vì vậy bạn không bắt buộc phải sử dụng dấu ngoặc đơn với nó. Tuy nhiên, nếu bạn muốn truyền nhiều hơn một tham số cho echo(), việc sử dụng dấu ngoặc đơn sẽ tạo ra lỗi phân tích cú pháp.