Hi,

Hope this can help.

Le 22/09/2015 20:16, j adams a écrit :
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.

Welcome to the jungle

2) What does zend_objects_get_address do? This reference looks very
different than the usual macro, e.g. Z_OBJ_HT_P

PHP uses an object store. This allows handling objects by reference. Every object instance is defined by a numeric handle (an offset in the object store). Object zvals contain the object handle. The object address is obtained through the object store. Look http://lxr.php.net/xref/PHP_5_6/Zend/zend_objects_API.c#274

Z_OBJ_HT() is used to call an object's handlers. This information is also present in the zend_object but, for a better performance AFAIK, also made available in the zval struct.

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?

Yes


4) What does zend_unmangle_property_name do? Why is this function changed
to zend_unmangle_property_name_ex in 5.5 and later?

Properties are stored using 'mangled' names. The format of a mangled name is '<NULL><class name><NULL><property name><NULL>', where <NULL> is a null byte. Class name and property name are 'decoded' by zend_unmangle_property_name(). Look http://lxr.php.net/xref/PHP_5_6/Zend/zend_compile.c#5373

5) Why do we call Z_ADDREF_PP(value) here? Is this reference counting to
prevent garbage collection?

This is reference counting. Incremented because a reference to the 'value' zval is added to the result array.

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.

Making code working with 5.3-5.6 is quite easy with a pair of ifdef. Unfortunately, writing code to compile on PHP 5 & 7 is complex. It seems most people porting extensions to PHP 7 finally duplicated most, if not all of their code.

Regards

François

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

Reply via email to