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
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to