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 <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





Best regards,
 Marcus


--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to