Re: Adding/Updating ZVal Arrays to Object

From: Date: Fri, 20 Feb 2009 22:02:14 +0000
Subject: Re: Adding/Updating ZVal Arrays to Object
References: 1 2  Groups: php.internals 
Request: Send a blank email to internals+get-43131@lists.php.net to get a copy of this message
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 <mrice@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


« previous php.internals (#43131) next »