Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:43330 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 48759 invoked from network); 12 Mar 2009 04:21:52 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 12 Mar 2009 04:21:52 -0000 X-Host-Fingerprint: 68.33.54.253 c-68-33-54-253.hsd1.dc.comcast.net Received: from [68.33.54.253] ([68.33.54.253:22930] helo=localhost.localdomain) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id C2/FA-09289-FDD88B94 for ; Wed, 11 Mar 2009 23:21:52 -0500 To: internals@lists.php.net Date: Thu, 12 Mar 2009 00:21:49 -0400 Message-ID: <2009031200214916807-fdintino@nflcorg> References: <2009031012193216807-fdintino@nflcorg> <257144875.20090310210319@marcus-boerger.de> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit User-Agent: Unison/1.7.9 X-Posted-By: 68.33.54.253 Subject: Re: [PHP-DEV] Cloning of objects passed as parameters From: fdintino@nflc.org (Frankie Dintino) 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); >> } >> } >