# Zend bug? Overloading API in PHP4

- Thread: https://externals.io/message/4007
- Original archive: https://news-web.php.net/php.internals/4007
- Started by Rasmus Lerdorf on 2003-08-15T22:10:45+00:00
- Messages: 2
- Reply by email to internals@lists.php.net
- More for agents: search with https://externals.io/search.md?q={query} · JSON API at https://externals.io/api · documentation at https://externals.io/llms.txt

---

## #4007 — Rasmus Lerdorf — 2003-08-15T22:10:45+00:00

URL: https://externals.io/message/4007#4007

Did the overloading API in PHP4 actually ever work?  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.

-Rasmus

---

## #4008 — Zeev Suraski — 2003-08-15T22:38:46+00:00

URL: https://externals.io/message/4007#4008 · In reply to: #4007

At 01:10 16/08/2003, Rasmus Lerdorf wrote:
>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
