David Jean Louis [2008-03-10 11:57 UTC]Nice code, works well for me :)
I would just remove the getters/setters in Net_Nmap_Service and Net_Nmap_Host (for this one maybe __get() and __set() would help), but that's just a matter of taste.
David Jean Louis [2008-03-10 12:38 UTC]oh I forgot: you should use escapeshellcmd() for all data that can be passed to the command line, this will prevent things like:
$target = array('127.0.0.1', '&& rm -f /some/critical/files #');
$nmap = new Net_Nmap();
Michael Gauthier [2008-03-10 12:51 UTC]Check out the Crypt_GPG package for a good example (imho) of using PHP to control another process.
Also, your class-level docblocks should not have whitespace before 'class Foo'.
Chuck Burgess [2008-03-12 13:34 UTC]Class hierarchy looks good. I like the usage of that __get() and _set(), now that I actually see how you're using it (for touching keys in your private array, rather than touching actual private variables... I had previously assumed it was private variables). One typo I see in _Service's $_properties initialization is that the 'product' key is listed three times.
CS-wise, your current code looks quite clean :)
Last thought would be that if this is indeed PHP5-only, how feasible is it to replace the PEAR_Error usage with PEAR_Exception?