fn empty_from_class_type(
        class_name: &str,
        pass_by_ref: bool,
        is_variadic: bool,
        allow_null: bool,
    ) -> Option<Self> {
        let mut flags = Self::arg_info_flags(pass_by_ref, is_variadic);
        if allow_null {
            flags |= _ZEND_TYPE_NULLABLE_BIT;
        }
        cfg_if::cfg_if! {
            if #[cfg(php83)] {
                flags |= crate::ffi::_ZEND_TYPE_LITERAL_NAME_BIT
            } else {
                flags |= crate::ffi::_ZEND_TYPE_NAME_BIT
            }
        }

        Some(Self {
            ptr: std::ffi::CString::new(class_name)
                .ok()?
                .into_raw()
                .cast::<c_void>(),
            type_mask: flags,
        })
    }
Attempts to create a zend type for a class object type. Returns an
option containing the type if successful.

Returns [`None`] if the data type was a class object where the class
name could not be converted into a C string (i.e. contained
NUL-bytes).

# Parameters

* `class_name` - Name of the class parameter.
* `pass_by_ref` - Whether the type should be passed by reference.
* `is_variadic` - Whether the type is for a variadic argument.
* `allow_null` - Whether the type should allow null to be passed in
place.
src/zend/_type.rs