On Fri, Jan 15, 2021 at 6:11 PM James Colannino <[email protected]>
wrote:
> I have the following method defined in a PHP 8 extension:
>
> ZEND_BEGIN_ARG_INFO(arginfoCtor, 0)
> ZEND_ARG_TYPE_INFO(0, hostname, IS_STRING, 0)
> ZEND_ARG_TYPE_INFO(0, port, IS_LONG, 1)
> ZEND_END_ARG_INFO()
>
> PHP_METHOD(Trogdord, __construct) {
>
> trogdordObject *objWrapper = ZOBJ_TO_TROGDORD(Z_OBJ_P(getThis()));
>
> char *hostname;
> size_t hostnameLength;
> long port = TROGDORD_DEFAULT_PORT;
>
> zend_parse_parameters_throw(
> ZEND_NUM_ARGS(),
> "s|l",
> &hostname,
> &hostnameLength,
> &port
> );
>
> ...
> }
>
> This works fine on PHP 7, but on PHP 8, I get an "Arg info / zpp
> mismatch" error. I discovered that if I comment out
> "ZEND_ARG_TYPE_INFO(0, port, IS_LONG, 1)", it works, but I'd like to
> type hint that second optional argument if possible. Maybe I was always
> doing this the wrong way, but I thought that the last argument 1 to
> allow null was the proper way to handle this and I'm not sure why it
> results in an error now.
>
> Can anyone tell me the correct way to approach this in PHP 8? Thank you!
>
Your arginfo declares the arugment as nullable, but your zpp call does not.
Thus the error. You need:
zend_bool port_is_null = 1;
zend_parse_parameters_throw(
ZEND_NUM_ARGS(),
"s|l!", // ! means nullable
&hostname,
&hostnameLength,
&port,
&port_is_null // Whether null was actually passed
);
Regards,
Nikita