Re: Cloning of objects passed as parameters
| From: | Frankie Dintino | Date: | Thu, 12 Mar 2009 04:21:49 +0000 |
| Subject: | Re: Cloning of objects passed as parameters | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-43330@lists.php.net to get a copy of this message | ||
Thanks Marcus,
Actually, persistence wasn't the only issue. I had to make sure that the DOMDocument wasn't later modified, as that could lead to weird behavior. Basically, what i needed was a way to pass an object by copy rather than by reference, as it was in ZE1. I figured out a solution, so I'm posting it here in case somebody stumbles on this post with the same question I had.
ZEND_METHOD(xydelta, setStartDocument) {
zval *id, *doc = NULL;
xydelta_object *intern;
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
getThis(),, "Oo", &id, xydelta_ce, &doc) == FAILURE) {
RETURN_FALSE;
}
intern = (xydelta_object *)zend_object_store_get_object(id TSRMLS_CC);
if (intern == NULL) {
RETURN_FALSE;} // Error checking removed for brevity... // ... // Clone zval* doc zend_object_handlers *handlers = Z_OBJ_HT(doc); zval *doc_clone; MAKE_STD_ZVAL(doc_clone); Z_TYPE_P(doc_clone) = IS_OBJECT; Z_OBJVAL(doc_clone) = handlers->clone_obj(doc); // Get cloned object intern->libxml_start_doc = (php_libxml_node_object *)
zend_object_store_get_object(doc_clone TSRMLS_CC);} } On 2009-03-10 16:03:19 -0400, helly@php.net (Marcus Boerger) said:
Hello Frankie, DOMDocuments are reference counted, hence zou can simplz increase their refcount when storing the connection and delete the ref when dropping the connection, probably in your destructor. Best regards, Marcus Tuesday, March 10, 2009, 5:19:32 PM, you wrote:I'm writing a PHP class with a method that has to be passed a DOMDocument object, and it needs to retain that object throughout the life of its instantiation. However, the (dom_object *) returned from zend_parse_method_parameters is just a pointer to the passed object, and so it disappears when the original document is unset or goes out of scope. How would one go about cloning the DOMDocument to save in the class's struct?example: ZEND_METHOD(xydelta, setStartDocument) { zval *id, *doc = NULL; xydelta_object *intern;if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oo", &id, xydelta_ce, &doc) == FAILURE) { RETURN_FALSE; }intern = (xydelta_object *)zend_object_store_get_object(id TSRMLS_CC); if (intern != NULL) { // Error checking removed for brevity... // ...// This pointer cannot be accessed once the object that was used as the first parameter goes out of scope intern->libxml_start_doc = (php_libxml_node_object *) zend_object_store_get_object(doc TSRMLS_CC); } }