Re: [RFC] Enumerations
| From: | tyson andre | 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