Thank you, Sean. Still looking for a couple of answers... > 1) 'Default Properties' or properties stored on the class (not object) can be found on the zend_class_entry[0], they are just accessed by offset [1] > This isn't a stable/public API, but good for a cool hack!
I'm afraid I don't follow. Could you elaborate? I've seen one way to get 'default properties' from a zend_class_entry object: zendClassEntry->default_properties; This gets us a list of default properties. I've also seen zendClassEntry->properties_info; Which, if I'm not mistaken, involves more elaborate parsing logic but also tells you whether properties are accessible. Seems like numerous ways to skin a cat. What is the orthodox approach here? Also, what do you suggest to distinguish 'sealed' (i.e., default) properties from dynamic ones? Is there some counterpart to default_properties that returns non_default_properties -- i.e., just the dynamic ones? Or should I just get all of the object's properties and check each key to see if it's one of the default_properties by searching a HashTable of these default properties? > 3) Never used this, but it seems to be to confirm that a mangled prop name matches a zend_property_info * Not sure I follow. We create a separate zobj of type zend_object using the function: zobj = zend_objects_get_address(obj TSRMLS_CC); And then use zobj to check access: if (zend_check_property_access(zobj, key, key_len-1 TSRMLS_CC) == SUCCESS) { I find it odd that our native zval type would not encompass member accessibility. I'm wondering if zend_object might be some kind of historical add-on concept to expand very old PHP functionality or if there's some reason for this distinct object type. On Tue, Sep 22, 2015 at 12:32 PM, Sean DuBois <s...@siobud.com> wrote: > On Tue, Sep 22, 2015 at 11:16:46AM -0700, j adams wrote: > > I'm working on a data serialization routine wherein I must iterate > through > > an object's properties while distinguishing between "sealed" properties > > (i.e., those specified by class definitions) and "dynamic" properties" > > (i.e., those assigned ad-hoc to some object that are not party of any > class > > definition). > > > > I found the source of the php function get_object_vars(): > > http://lxr.php.net/xref/PHP_5_6/Zend/zend_builtin_functions.c#985 > > However, I am still pretty confused. PHP source is *full* of macros and > has > > basically no comments. Hoping for some tips to keep me on the right > track. > > I'm pretty sure I can get something kludgy working, but I want my code to > > be orthodox and work well. > > > > QUESTIONS > > 1) Sadly, this approach is unable to distinguish "sealed" properties from > > dynamic ones. If anyone can refer me to some source (or outline a general > > approach) which can first iterate sealed properties and then iterate only > > dynamic ones, that would be extremely helpful. > > > > 2) What does zend_objects_get_address do? This reference looks very > > different than the usual macro, e.g. Z_OBJ_HT_P > > > > 3) Am I correct in understanding that zend_check_property_access simply > > checks if the property in question is availabe in the scope in which this > > function call gets executed? Is this the canonical/orthodox way to make > > this check? > > > > 4) What does zend_unmangle_property_name do? Why is this function changed > > to zend_unmangle_property_name_ex in 5.5 and later? > > > > 5) Why do we call Z_ADDREF_PP(value) here? Is this reference counting to > > prevent garbage collection? > > > > 6) An IS_INTERNED check is added in php 5.6 and yet the macro for > > IS_INTERNED is zero. What's that all about? > > > > 7) The code looks quite different between the different versions: > > 5.3 - http://lxr.php.net/xref/PHP_5_3/Zend/zend_builtin_functions.c#950 > > 5.5 - http://lxr.php.net/xref/PHP_5_5/Zend/zend_builtin_functions.c#982 > > 5.6 - http://lxr.php.net/xref/PHP_5_6/Zend/zend_builtin_functions.c#985 > > From what I can tell there is at least one difference between 5.3 and 5.6 > > -- zend_unmangle_property_name_ex does not exist before 5.5. Can anyone > > recommend how to make code that'll work in 5.3-5.6? Also, with 7 coming > out > > I'd like it work there too. > > > > Any answers or assistance would be greatly appreciated. > Hey, > > 1) 'Default Properties' or properties stored on the class (not object) > can be found on the zend_class_entry[0], they are just accessed by offset > [1] > > This isn't a stable/public API, but good for a cool hack! > > 3) Never used this, but it seems to be to confirm that a mangled prop name > matches a > zend_property_info * > > 4) [2] Is some good reading on property name mangling > > 5) [3] Pretty much! Refcount is just to keep track of when a zval can be > destroyed > > Hopefully the more educated members of the list can follow up and fix my > errors, but for now that > will at least get you going/able to dive deeper. > > > [0] http://lxr.php.net/xref/PHP_5_6/Zend/zend.h#488 > [1] http://lxr.php.net/xref/PHP_5_6/ext/reflection/php_reflection.c#3410 > [2] > http://www.phpinternalsbook.com/classes_objects/internal_structures_and_implementation.html > [3] http://www.phpinternalsbook.com/zvals/memory_management.html >