# Follow the object constructor chain ... options

- Thread: https://externals.io/message/19805
- Original archive: https://news-web.php.net/php.internals/19805
- Started by Bob Silva on 2005-10-29T02:35:02+00:00
- Messages: 3
- 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

---

## #19805 — Bob Silva — 2005-10-29T02:35:02+00:00

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

What would be the suggested method of simulating parent::__construct in
C-level objects?

I looked through the source and could find no examples to draw from.

 

Since my base object is the foundation of my extension, its constructor has
to be called on each derived object creation.

 

I have a few ideas that have to do with looping through ce->parent and
zend_call_function.

Was wondering if you guys can offer some of your experience on how you would
approach this problem.

 

Bob Silva

---

## #19811 — Bob Silva — 2005-10-29T07:18:24+00:00

URL: https://externals.io/message/19805#19811 · In reply to: #19805

I believe I have it working. Anyone see any blatant problems with this?
Also, would it make sense to have this functionality in the engine itself?
Seeing as that internal classes have inheritance capabilities, it seems
logical to have the functionality to call a parent constructor within the
engine itself. I could definitely see this being useful within the SPL as
its class library continues to grow as well.

void pow_call_parent_constructor(zval *object TSRMLS_DC)
{
    zend_class_entry *ce = EG(function_state_ptr)->function->common.scope;

    if (ce->parent && ce->parent->constructor) {
        zval *retval_ptr;
        zend_fcall_info fci;
        zend_fcall_info_cache fcc;

        if (!(ce->parent->constructor->common.fn_flags & ZEND_ACC_PUBLIC)) {
            return;
        }

        fci.size = sizeof(fci);
        fci.function_table = NULL;
        fci.function_name = NULL;
        fci.symbol_table = NULL;
        fci.object_pp = &object;
        fci.retval_ptr_ptr = &retval_ptr;
        fci.param_count = 0;
        fci.params = NULL;
        fci.no_separation = 1;

        fcc.initialized = 1;
        fcc.function_handler = ce->parent->constructor;
        fcc.calling_scope = ce;
        fcc.object_pp = &object;

        if (zend_call_function(&fci, &fcc TSRMLS_CC) == FAILURE) {
            return;
        }
        if (retval_ptr) {
            zval_ptr_dtor(&retval_ptr);
        }
    }
}

Forgive me if its crude, but it appears to work.

Bob


-----Original Message-----
From: Bob Silva [mailto:me@bobsilva.com] 
Sent: Friday, October 28, 2005 7:35 PM
To: internals@lists.php.net
Subject: [PHP-DEV] Follow the object constructor chain ... options

What would be the suggested method of simulating parent::__construct in
C-level objects?

I looked through the source and could find no examples to draw from.

 

Since my base object is the foundation of my extension, its constructor has
to be called on each derived object creation.

 

I have a few ideas that have to do with looping through ce->parent and
zend_call_function.

Was wondering if you guys can offer some of your experience on how you would
approach this problem.

 

Bob Silva

---

## #19813 — Marcus Boerger — 2005-10-29T10:58:18+00:00

URL: https://externals.io/message/19805#19813 · In reply to: #19811

Hello Bob,

  why so complex and potential wrong?

zend_class_entry *ce = Z_OBJ_CE(object);
zend_function    *ctor = ce->parent ? ce->parent->constructor : NULL;

if (ctor && ctor->common.fn_flags & ZEND_ACC_PUBLIC) {
   zend_call_method_with_0_params(object, ce, ctor, "__construct", NULL);
}

btw, why public? the parent ctor must only be called from a derived
class instance, thus you want to check against !private. But in that
case either the class or the ctor should be final and thus you shouldn't
have this issue.

marcus

Saturday, October 29, 2005, 9:18:24 AM, you wrote:

> I believe I have it working. Anyone see any blatant problems with this?
> Also, would it make sense to have this functionality in the engine itself?
> Seeing as that internal classes have inheritance capabilities, it seems
> logical to have the functionality to call a parent constructor within the
> engine itself. I could definitely see this being useful within the SPL as
> its class library continues to grow as well.

> void pow_call_parent_constructor(zval *object TSRMLS_DC)
> {
>     zend_class_entry *ce = EG(function_state_ptr)->function->common.scope;

>     if (ce->parent && ce->parent->constructor) {
>         zval *retval_ptr;
>         zend_fcall_info fci;
>         zend_fcall_info_cache fcc;

>         if (!(ce->parent->constructor->common.fn_flags & ZEND_ACC_PUBLIC)) {
>             return;
>         }

>         fci.size = sizeof(fci);
>         fci.function_table = NULL;
>         fci.function_name = NULL;
>         fci.symbol_table = NULL;
>         fci.object_pp = &object;
>         fci.retval_ptr_ptr = &retval_ptr;
>         fci.param_count = 0;
>         fci.params = NULL;
>         fci.no_separation = 1;

>         fcc.initialized = 1;
>         fcc.function_handler = ce->parent->constructor;
>         fcc.calling_scope = ce;
>         fcc.object_pp = &object;

>         if (zend_call_function(&fci, &fcc TSRMLS_CC) == FAILURE) {
>             return;
>         }
>         if (retval_ptr) {
>             zval_ptr_dtor(&retval_ptr);
>         }
>     }
> }

> Forgive me if its crude, but it appears to work.

> Bob


> -----Original Message-----
> From: Bob Silva [mailto:me@bobsilva.com] 
> Sent: Friday, October 28, 2005 7:35 PM
> To: internals@lists.php.net
> Subject: [PHP-DEV] Follow the object constructor chain ... options

> What would be the suggested method of simulating parent::__construct in
> C-level objects?

> I looked through the source and could find no examples to draw from.

>  

> Since my base object is the foundation of my extension, its constructor has
> to be called on each derived object creation.

>  

> I have a few ideas that have to do with looping through ce->parent and
> zend_call_function.

> Was wondering if you guys can offer some of your experience on how you would
> approach this problem.

>  

> Bob Silva




Best regards,
 Marcus
