Working to implement Getter/Setter Accessor syntax as per https://wiki.php.net/rfc/propertygetsetsyntax but brand new to php internals development.
I was planning on having the parser define methods on the class for the getter/setter such as __getHours() and __setHours() and then have those functions called in leiu of __get() if they are defined, does that seem like a reasonable strategy for this? More specific problems on the parser side of things, here is what I have now: getter_setter_declarations: getter_declaration setter_declaration | setter_declaration getter_declaration | setter_declaration | getter_declaration | /* empty */ ; getter_declaration: method_modifiers T_GET { zend_do_begin_function_declaration(&$2, &$$, 1, ZEND_RETURN_VAL, &$1 TSRMLS_CC); } '{' inner_statement_list '}' { /******** $$ != Hours Here!! ***************/ zend_do_abstract_method(&$$, &$1, &$4 TSRMLS_CC); zend_do_end_function_declaration(&$2 TSRMLS_CC); } setter_declaration: T_SET '{' inner_statement_list '}' class_variable_declaration: T_VARIABLE { $$ = $1; /**** Capture variable name ****/ } '{' getter_setter_declarations '}' | class_variable_declaration ',' T_VARIABLE { zend_do_declare_property(&$3, NULL, CG(access_type) TSRMLS_CC); } | class_variable_declaration ',' T_VARIABLE '=' static_scalar { zend_do_declare_property(&$3, &$5, CG(access_type) TSRMLS_CC); } | T_VARIABLE { zend_do_declare_property(&$1, NULL, CG(access_type) TSRMLS_CC); } | T_VARIABLE '=' static_scalar { zend_do_declare_property(&$1, &$3, CG(access_type) TSRMLS_CC); } ; I'm just working on the getter now. 1) I am able to get the T_VARIABLE name passed through to the zend_do_begin_function() using $$ however $$ is no longer correctly set by zend_do_abstract_method(). What would be a more appropriate way to store the variable znode? I see there are a number of stacks in the compiler_globals, would using one of those or creating a new one be appropriate? 1.1) Alternatively to #1, is there a way to access the T_VARIABLE znode from the zend_do_begin_function_declaration() line? (Reach re patterns from previous/prior matches/lines) 2) I am having trouble with building the function name (2nd param to zend_do_begin_function) since that function needs to have a znode as the input. I could stuff code in here to concat the strings together and build a znode but since there is sparsely any real code in this file I hesitate to do so. Any recommendations here? 3) An interesting situation with the above code is that the function is declared and is seen through a ReflectionClass() but calling it indicates that the function does not exist, I think that is because $$ was cleared/changed by the time zend_do_abstract() is called, is this something I should add a check for? (Calling zend_do_abstract() with a function name that was not previously seen via zend_do_begin_function_declaration()) For reference, here is the PHP test class I am using: #!/opt/trunk/sapi/cli/php <?php class TimePeriod { public $Seconds; public function __construct($Seconds) { $this->Seconds = $Seconds; } public $Hours { get { return $this->Seconds / 3600; } /* set { $this->Seconds = $value * 3600; } // The variable $value holds the incoming value to be "set"*/ }; } $o = new TimePeriod(3600); echo $o->Seconds."\r\n"; echo $o->Hours()."\r\n"; ?> -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php