On Fri, Jan 15, 2021 at 6:11 PM James Colannino <compo...@colannino.dev> 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