On Fri, Feb 20, 2009 at 12:31 PM, Matthew C. Rice <mr...@rcs.us> 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-- <?php if (!extension_loaded("pure_mvc")) print "skip"; ?> --FILE-- <?php 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