Re: [RFC] Enumerations

From: Date: Sat, 05 Dec 2020 16:15:32 +0000
Subject: Re: [RFC] Enumerations
References: 1 2 3  Groups: php.internals 
Request: Send a blank email to internals+get-112430@lists.php.net to get a copy of this message
Hi Larry Garfield, > Right now they'd do the same as objects, so they'd serialize as an object.. > Unserializing like that, though... hm, that would probably NOT still be === due to the way PHP > handles objects. > That's probably undesireable, but I'm not sure at the moment the best way around > that.  I'll have to discuss with Iliya. At a glance, it seems like it's doable in php 8.1 internals to make the unserializer return a singleton if you override the C unserialize callback of the class (this could introduce edge cases during unserialization failure for destruction, expected to be solvable). This would require using the C: serialize() encoding (php uses that for classes implementing Serializable), not o: (unserialize can be set to a generic C function that creates a value and puts it in *object*) ``` // Zend/zend.h struct _zend_class_entry { /* .... serializer callbacks */ int (*serialize)(zval *object, unsigned char **buffer, size_t *buf_len, zend_serialize_data *data); int (*unserialize)(zval *object, zend_class_entry *ce, const unsigned char *buf, size_t buf_len, zend_unserialize_data *data); // ext/standard/var_unserializer.c, in object_custom() if (ce->unserialize == NULL) { zend_error(E_WARNING, "Class %s has no unserializer", ZSTR_VAL(ce->name)); object_init_ex(rval, ce); } else if (ce->unserialize(rval, ce, (const unsigned char*)*p, datalen, (zend_unserialize_data *)var_hash) != SUCCESS) { return 0; } ``` (I'm one of the maintainers of https://pecl.php.net/package/igbinary , an alternative binary php serializer) - Tyson

« previous php.internals (#112430) next »