Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:43131 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 31423 invoked from network); 20 Feb 2009 22:02:18 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 20 Feb 2009 22:02:18 -0000 X-Host-Fingerprint: 66.153.171.97 rcs.us Received: from [66.153.171.97] ([66.153.171.97:20756] helo=localhost.localdomain) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id A6/60-28577-9682F994 for ; Fri, 20 Feb 2009 17:02:17 -0500 Message-ID: To: internals@lists.php.net Date: Fri, 20 Feb 2009 17:02:14 -0500 User-Agent: Thunderbird 2.0.0.19 (Windows/20081209) MIME-Version: 1.0 References: <7dd2dc0b0902201341q61230fcavfc9fdc9f42383289@mail.gmail.com> In-Reply-To: <7dd2dc0b0902201341q61230fcavfc9fdc9f42383289@mail.gmail.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Posted-By: 66.153.171.97 Subject: Re: [PHP-DEV] Adding/Updating ZVal Arrays to Object From: mrice@rcs.us ("Matthew C. Rice") Nathan, Thanks a bunch. That was exactly what I was looking for. Is there any place you would consider a good resource to learn/get documentation for these functions? Matthew C. Rice Nathan Nobbe wrote: > On Fri, Feb 20, 2009 at 12:31 PM, Matthew C. Rice wrote: > >> Hello everyone, >> >> >> I am building a custom PHP Extension. It is object based, and while the >> documentation seems to be lacking a little on this aspect in extensions, I >> haven't let that slow me down. I have used other extensions as examples, and >> done a great deal of searching around to find everything I have needed until >> now. >> >> I currently have the following http://pastebin.com/m74c98b43 ( the >> start method ) in my classes __construct ( I actually use PHP_MALIAS to >> alias __construct to the function ) .. This works perfect. It creates a >> array in the object, just as I expect it to. >> >> I can even print out the number of elements and their values in the >> debug function by passing $Obj->Property to it >> >> The problem I am having is that I can't seem to figure out a way to >> append values on to the ZVal Array in another PHP_METHOD(). I have tried >> combinations of zend_hash_find() && zend_hash_update() to no avail. Is >> there anyone that might be able to point me in the right direction as to how >> to do this? > > > i think mainly you just need to read the zval from the instance, operate on > it, then update the instance. heres some working code from the extension > ive been working on, > > /* {{{ proto public void MacroCommand::addSubCommand(string commandClassRef) > add a subcommand to this MacroCommand */ > PHP_METHOD(MacroCommand, addSubCommand) > { > zval *this, *subCommands, *subCommand; > char *rawSubCommand; > int rawSubCommandLength; > > if( zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", > &rawSubCommand, &rawSubCommandLength) == FAILURE) { > RETURN_NULL(); > } > > MAKE_STD_ZVAL(subCommand); > ZVAL_STRINGL(subCommand, rawSubCommand, rawSubCommandLength, 1); > > this = getThis(); > zend_class_entry *this_ce = zend_get_class_entry(this); > subCommands = zend_read_property(puremvc_macrocommand_ce, this, > "subCommands", > sizeof("subCommands")-1, 1 TSRMLS_CC); > > ZVAL_ADDREF(subCommand); > add_next_index_zval(subCommands, subCommand); > > zend_update_property(puremvc_macrocommand_ce, this, "subCommands", > sizeof("subCommands")-1, > subCommands TSRMLS_CC); > } > /* }}} */ > > and heres my unit test for this method, > > --TEST-- > MacroCommand::addSubCommand(), ensure addSubCommand actually stores the > ICommand in an internal array > --SKIPIF-- > > --FILE-- > class SubCommand {} > class MyMacroCommand extends MacroCommand { > protected function initializeMacroCommand() { > $this->addSubCommand('SubCommand'); > } > } > $macroCmd = new MyMacroCommand(); > var_dump($macroCmd); > ?> > --EXPECT-- > object(MyMacroCommand)#1 (2) { > ["facade:protected"]=> > string(0) "" > ["subCommands:private"]=> > array(1) { > [0]=> > string(10) "SubCommand" > } > } > > hope this helps, > > -nathan >