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

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

Reply via email to