Hello Jon,

Saturday, January 3, 2004, 2:21:12 AM, you wrote:

> On Fri, Jan 02, 2004 at 05:00:33PM -0800, Andrei Zmievski wrote:

>> > It appears to be a side-effect of not defining the 'scope' field in
>> > the zend_internal_function call that is invokved from my custom
>> > 'constructor_get' handler.  If the 'scope' field is NULL, my object
>> > is treated as a reference.  If I assign my class entry to the 'scope'
>> > field, the object is "normal" (i.e. not a reference).
>> 
>> Hmm, can I see the code?

> Here's my constructor function definition:

>     zend_internal_function php_python_constructor_function = {
>         ZEND_INTERNAL_FUNCTION,     /* type */
>         "python",                   /* function_name */
>         &python_class_entry,        /* scope */
>         0,                          /* fn_flags */
>         NULL,                       /* prototype */
>         0,                          /* num_args */
>         NULL,                       /* arg_info */
>         0,                          /* pass_rest_by_reference */
>         ZEND_FN(python_new)         /* handler */
>     };

> I use this function as part of my class initialization:

>     INIT_CLASS_ENTRY(python_class_entry, "python", NULL);
>     python_class_entry.create_object = python_object_create;
>     python_class_entry.constructor = (union _zend_function 
> *)&php_python_constructor_function;
>     zend_register_internal_class(&python_class_entry TSRMLS_CC);

> And I return the 'constructor' value from my 'constructor_get'
> handler:

>     static union _zend_function *
>     python_constructor_get(zval *object TSRMLS_DC)
>     {
>         php_python_object *obj = PIP_FETCH(object);

>         return obj->ce->constructor;
>     }

> If I specify NULL for the 'scope' field, I end up with a second
> reference to the new object.

> I don't know if that's intentional or a bug.  I'm still getting
> familiar with the new object model code.



Why do you make it so complicated?
You could imply provide a list of methods for your objects and register
them with the third parameter of INIT_CLASS_ENTRY() macro. That would handle
the constructor correct. Also you should name the constructor '__construct'
instead of 'python' because the former is the prefered way for ZE2.

-- 
Best regards,
 Marcus                            mailto:[EMAIL PROTECTED]

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to