Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:43145 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 43778 invoked from network); 21 Feb 2009 13:52:53 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 21 Feb 2009 13:52:53 -0000 X-Host-Fingerprint: 66.153.171.97 rcs.us Received: from [66.153.171.97] ([66.153.171.97:10419] helo=localhost.localdomain) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 94/7A-62765-43700A94 for ; Sat, 21 Feb 2009 08:52:52 -0500 Message-ID: <94.7A.62765.43700A94@pb1.pair.com> To: internals@lists.php.net Date: Sat, 21 Feb 2009 08:52:46 -0500 User-Agent: Thunderbird 2.0.0.19 (Windows/20081209) MIME-Version: 1.0 References: <7dd2dc0b0902201341q61230fcavfc9fdc9f42383289@mail.gmail.com> <1836161691.20090221131636@marcus-boerger.de> In-Reply-To: <1836161691.20090221131636@marcus-boerger.de> 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") Marcus, Thanks a bunch! I had a similar style pdf I found on the pecl site titled 200510_zend_conf_php_extension_development.pdf , but it was lacking a little on OOP. This looks like exactly what I needed. Between this and the Sara Golemon book I hope to fill a major gap.. Thanks again !!! Matthew C. Rice Marcus Boerger wrote: > Hello Matthew, > > I gave a bunch of tutorials on this with various other folks, Johannes, > Sara, Wez. The slides from November 2007 are still up and contain probably > more information than you ever wanted to know. There is also the demo > extension that you can access through cvs. > > http://talks.somabo.de/200711_php_code_camp.pdf > http://talks.somabo.de/200711_php_code_camp.pps > http://cvs.php.net/viewvc.cgi/pecl/demoext/ > > Friday, February 20, 2009, 11:02:14 PM, you wrote: > >> 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 >>> > > > > > Best regards, > Marcus >