Did the overloading API in PHP4 actually ever work?
Yep.
I have done some simple stuff with it in the past, but I tried using it for something real today and it is falling over. I have a very simple example extension which illustrates it. See http://lerdorf.com/ovl.tar.gz
For the lazy, here is the meat of it. The problem is in my set function which looks like this:
int _ovl_property_set(zend_property_reference *prop_ref, zval *value) {
zend_llist_element *element = prop_ref->elements_list->head;
zval overloaded_property = ((zend_overloaded_element *)(element->data))->element;
zval_add_ref(&value);
add_property_zval(prop_ref->object, Z_STRVAL(overloaded_property), value);
return SUCCESS;
}
If I do:
$obj->foo = array(1,2,3);
Then the zval value that gets passed to my set function is messed up. If instead I do:
$tmp = array(1,2,3); $obj->foo = $tmp;
Then everything is fine.
The http://lerdorf.com/ovl.tar.gz tarball has a full self-contained example of the problem if someone wouldn't mind having a look.
You can't (reliably) connect to zval's that are passed to the setter callback in ZE1, as they're not necessarily reference counted. If you want to retain them, you have to duplicate them (using zval_copy_ctor()).
array(1,2,3) is a temporary value that is destroyed regardless of its reference count.
Zeev
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php