Hello, Joseph! I faced exactly the same problems and believe that the Observer API is necessary.

To solve a similar problem, I implemented my own API over FFI, however, it does not work very stable (I have little experience in send api), but it may help to solve your problems: https://github.com/SerafimArts/Observer

09.03.2021 5:32, Joseph Montanez пишет:
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;


I've gone ahead and made a test extension here:
https://github.com/joseph-montanez/php-ext-reference-issue . I've made each
struct a PHP object. allowing me to do this:

<?php
$position = new \skeleton\Vector3(1,2,3);
$direction = new \skeleton\Vector3(4,5,6);

$ray = new \skeleton\Ray($position, $direction);

echo 'Z: ', $ray->position->z, PHP_EOL; // Outputs: 3

$position->z = 9;

echo 'Z: ', $ray->position->z, PHP_EOL; // Outputs: 9

The PHP Ray object is defined as so:
typedef struct _skeleton_ray_object {
     Ray ray;
     HashTable *prop_handler;
     zend_object std;

     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?


Thanks,
Joseph Montanez


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

Reply via email to