Hi Joseph! Is this for educational purposes or real world usage?
I ask, because, if you don't have to adhere to a predefined C-API you would avoid lots of headache by baking all this stuff into your PHP objects with the APIs provided by Zend. But then again, it would be way more efficient to just write it all in PHP code. More comments following inline. On 09/03/2021 03.32, Joseph Montanez wrote: > I am not sure what to title this but the gist is that I have two structs > with a one way dependency: > > // Vector3 type > typedef struct Vector3 { > float x; > float y; > float z; > } Vector3; > > // Ray type (useful for raycast) > typedef struct Ray { > Vector3 position; // Ray position (origin) > Vector3 direction; // Ray direction > } Ray; As these are embedded structs instead of pointers to, neither do point to the memory of the other. > The PHP Ray object is defined as so: > typedef struct _skeleton_ray_object { > Ray ray; > HashTable *prop_handler; > zend_object std; ^^^^^^^^^^^^^^^^ NOTE: This has to be the last line in your object struct because of an VLA at the end of the zend_object struct. See your xyz_new() function where you allocate additional zend_object_properties_size() bytes for that VLA (variable length array). > > skeleton_vector3_object *position; > skeleton_vector3_object *direction; > } skeleton_ray_object; > > When I update either vector3 object, I don't have a way to propagate the > changes back to the parent object(Ray). This means the raw Ray struct is > never updated. Is there a built-in way to handle propagation (listeners) in > a PHP extension or will I need to hand roll this? Yes, you gotta write all of this on your own, but let me repeat that this is a lot of boilerplate which also may entail lots of headache. -- Regards, Mike
OpenPGP_signature
Description: OpenPGP digital signature