Re: Writeing OO exteions for PHP 4.3

From: Date: Fri, 03 Sep 2004 18:33:51 +0000
Subject: Re: Writeing OO exteions for PHP 4.3
References: 1 2  Groups: php.internals 
Request: Send a blank email to internals+get-12567@lists.php.net to get a copy of this message
Hi,
If I understand you correctly you can put this pointer inside of a resource container and return the resource container to user space as the return value from url_init(). Then, from url_set_string() you accept the resource as a parameter and extract the pointer to your CPP instance of whatever class.
Tanks for your response, but your solution do not work for me, because I don’t get the resource_id as parameter for calls to the object. ($php_url_object->set_string(“asdf”); ) I now save the C++ Object pointer in a resource and save this resource as an attribute of the PHP object. PHP_FUNCTION(url_init) { Url_class * url = new Url_class; zval * this_p = getThis(); MAKE_STD_ZVAL(return_value); int res_id = ZEND_REGISTER_RESOURCE(NULL, url, le_url); add_property_resource(getThis(), "url_class_ressource", res_id); } It’s a little bit tricky to extract this resource and the inherit pointer again, like I do in my set_string function: PHP_FUNCTION(url_set_string) { zval ** ressource; if( zend_hash_find(getThis()->value.obj.properties, "url_class_ressource", sizeof("url_class_ressource"), (void**) &ressource) == FAILURE ) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not find url_class_ressource"); RETURN_FALSE; } if( ressource == NULL || (*ressource) == NULL ||(*ressource)->type != IS_RESOURCE ) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Ressource not found"); RETURN_FALSE; } Url_class * url; url = (Url_class *) zend_fetch_resource(ressource TSRMLS_CC, -1, "url", NULL, 1, le_url); ZEND_VERIFY_RESOURCE(url); if( url == NULL ) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Ressource is invalid???"); RETURN_FALSE; } if(url->setString("test")) { RETURN_TRUE; } RETURN_FALSE; } But I don’t get memory leeks, because php makes sure my resource is destructed if it is not referenced anymore: static ZEND_RSRC_DTOR_FUNC(destroy_url) { Url_class * url = (Url_class *) rsrc->ptr;; delete url; } I am not to happy with this solution, because the user can access the "url_class_ressource" attribute of the PHP url Object, but this will work for now. Or can someone give me better solution? I am happy for everything which may help me,… Greets Jan

« previous php.internals (#12567) next »