Tôi đang phát triển một phần mở rộng PHP, bằng cách sử dụng C. Cho đến nay tôi đang làm việc trên xác nhận hợp lệ các đối số, được chuyển đến chức năng của phần mở rộng từ không gian người dùng PHP.Làm cách nào để tạo số đối số kiểm soát ZEND_BEGIN_ARG_INFO_EX, được chuyển đến tiện ích mở rộng PHP?
Macro ZEND_BEGIN_ARG_INFO_EX
có thể được sử dụng để cung cấp cho Zend Engine thông tin về các đối số của hàm. Tham số thứ 4 của macro, có tên là required_num_args
, để cho động cơ tự động kiểm soát số lượng đối số, loại bỏ rắc rối này khỏi tôi. Tuy nhiên, tôi không thể tìm thấy cách để làm cho nó hoạt động: động cơ luôn chạy chức năng của phần mở rộng mà không có bất kỳ cảnh báo nào, ngay cả khi một tập lệnh PHP không vượt qua đủ đối số.
Dưới đây là định nghĩa của tôi về đối số chức năng:
ZEND_BEGIN_ARG_INFO_EX(test_func_swt_arginfo, 0, 0, 3)
ZEND_ARG_INFO(1, firstArg)
ZEND_ARG_ARRAY_INFO(0, secondArg, true)
ZEND_ARG_OBJ_INFO(1, thirdArg, SomeClass, false)
ZEND_END_ARG_INFO()
Dưới đây là định nghĩa của tôi về chức năng, xuất khẩu của phần mở rộng PHP:
static const zend_function_entry test_func_functions[] = {
PHP_FE(sample_with_types, test_func_swt_arginfo)
PHP_FE_END
};
Đây là chức năng của tôi:
PHP_FUNCTION(sample_with_types)
{
RETURN_TRUE;
}
Đây là tập lệnh PHP tôi chạy:
<?php
sample_with_types();
Kết quả mong đợi: PHP hiển thị lỗi/cảnh báo/ngoại lệ, giống như "không đủ đối số được chuyển đến hàm"; chức năng không thực thi.
Kết quả thực tế: hàm thực hiện và trả về true
.
Làm cách nào để cấu hình đúng cấu trúc đối số hàm, để Công cụ Zend kiểm tra số đối số tự động? Hoặc tôi có nhầm lẫn mục đích của đối số required_num_args
trong macro ZEND_BEGIN_ARG_INFO_EX
không?
Cảm ơn bạn @netcoder về thông tin và nỗ lực nhằm làm rõ mục đích của macro đó. Nó có ý nghĩa rất nhiều, và thực sự tôi đã phát hiện ra rằng trước khi đặt câu hỏi. Tuy nhiên, điều chính gây ra sự khó hiểu của tôi và khiến tôi đi đến SO, là tham số 'required_num_args'. Nó có vẻ như tự động xác nhận của args num, nhưng trong thực tế nó không có gì. Nó có thể được, mà bạn biết mục đích của nó? –
@AndreyTserkus: 'required_num_args' được sử dụng để phản ánh và biểu thị thời điểm dừng tham số đếm theo yêu cầu (ví dụ: khi gọi' isOptional() '). Nó không có bất kỳ hiệu ứng nào khác ngoài điều đó. (Tôi đã cập nhật câu trả lời với thông tin này.) – netcoder
tuyệt vời, cảm ơn bạn! –