Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:88421 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 86136 invoked from network); 22 Sep 2015 19:32:37 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 22 Sep 2015 19:32:37 -0000 Authentication-Results: pb1.pair.com header.from=sean@siobud.com; sender-id=pass Authentication-Results: pb1.pair.com smtp.mail=sean@siobud.com; spf=pass; sender-id=pass Received-SPF: pass (pb1.pair.com: domain siobud.com designates 104.236.58.159 as permitted sender) X-PHP-List-Original-Sender: sean@siobud.com X-Host-Fingerprint: 104.236.58.159 siobud.com Received: from [104.236.58.159] ([104.236.58.159:35219] helo=siobud.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 3B/F2-00408-3DCA1065 for ; Tue, 22 Sep 2015 15:32:36 -0400 Received: from 3006.local (c-73-8-76-141.hsd1.il.comcast.net [73.8.76.141]) by siobud.com (Postfix) with ESMTPSA id 73F97D7CED; Tue, 22 Sep 2015 19:32:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=siobud.com; s=mail; t=1442950353; bh=jMXNdJ2gs8i/xyJlcoAGSOksXC4khXmbFF8jVZuk/VU=; h=Date:From:To:Cc:Subject:References:In-Reply-To; b=EQCn4ySg3fgR8XjIBf9z5HQOj7/BjO4RfAtSS2AGFLEuER/XZ9/DbbcQ0EukRKU+X +1bunRKldIaddnLkx4vElxzAU5NxEuaBWzIHx25sZ7RbjmCom4VmKJo+ys+seOpZmY /DRs92T0ADw/hs+IBCs4HHJsOsGgQnCdM9H61ZpE= Date: Tue, 22 Sep 2015 14:32:33 -0500 To: j adams Cc: internals Message-ID: <20150922193233.GA6474@3006.local> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) Subject: Re: [PHP-DEV] Data serialization of objects, want to iterate 'sealed' properties then dynamic ones From: sean@siobud.com (Sean DuBois) 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