Automattic / Automattic/VIP-Coding-Standards

Check the hook callback parameter count ?

Đang mở
#567 0 bình luận 1 reaction 0 người được giao Xem trên GitHub
Ngôn ngữ chính
PHP
Star
261
Fork
44
Merge trung bình
19 phút
Pull request đã merge (30 ngày)
1

Mô tả

## What problem would the enhancement address for VIP?

Prevent potential fatal `ArgumentCount` errors.

## Describe the solution you'd like

Inspired by the `AlwaysReturnInFilter` sniff, I was thinking that once the abstract hook/callback sniff exists, it wouldn't be that hard to create a sniff which would check synchronicity between the parameters requested from a hook-in and the callback function declaration.

This would apply to both `add_filter()` as well as `add_action()`.

Such a sniff would also be a candidate for (eventually moving to) WPCS, but I wanted to discuss the general idea here first, largely to see if the potential issue described above actually occurs in real life situations.

## What code should be reported as a violation?

```php
// Error: Two parameters expected, one (implicit) requested.
add_filter( 'the_title', function( $title, $id ) {
// Do something.
return $title;
} );

// Warning: One parameter expected, two requested.
add_filter( 'the_title', function( $title ) {
// Do something.
return $title;
}, 10, 2 );
```

## What code should *not* be reported as a violation?

```php
// OK: Two parameters expected, two requested.
add_filter( 'the_title', function( $title, $id ) {
// Do something.
return $title;
}, 10, 2 );

// OK: Three parameters expected, two requested, but third parameter is optional,
// which can be done by design to allow direct calls to the function to pass it.
function prefix_title_filter( $title, $id, $optional = null ) {
// Do something.
return $title;
}
add_filter( 'the_title', 'prefix_title_filter', 10, 2 );
```

## Additional context

### Future scope
* Once a list of WP native hooks + the amount of parameters they pass is known (via a trait in WPCS for instance), an additional check could be added that the `$accepted_args` parameter value is never higher than the number of passed parameters when the hook is called.

```php
function prefix_title_filter( $title, $id, $optional = null ) {
// Do something.
return $title;
}

// The `the_title` filter only passes two arguments max, so the code here is an error.
add_filter( 'the_title', 'prefix_title_filter', 10, 3 );
```
* For PHP native functions used in callbacks, reflection could be used to see how many (required) parameters these take and match that with the `$accepted_args` parameter.
* For WP native functions a list based solution would be needed to do the same.

## Relevant links
* https://developer.wordpress.org/reference/functions/add_action/
* https://developer.wordpress.org/reference/functions/add_filter/

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Hướng nghiên cứu

Bắt đầu bằng việc xem xét sniff AlwaysReturnInFilter hiện có và các entry point add_filter() và add_action() được ghi lại trong các tài liệu tham chiếu WordPress được liên kết. Làm rõ cách so sánh các khai báo callback và accepted_args, bao gồm các tham số tùy chọn và closure, trước khi xác định phạm vi của sniff. Công việc được hoàn tất khi hành vi đã được đặc tả cho các ví dụ vi phạm và không vi phạm được cung cấp.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
php
Lĩnh vực
tooling
Loại issue
Tính năng
Độ khó
5/5
Thời gian dự kiến
Hơn một tuần
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Cần làm rõ
Mức phù hợp với người mới
25/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.