Thank you for this, Sean! I'm making headway for php 5.5/5.6. This should
come in handy when/if I get around to PHP 7.

On Wed, Sep 23, 2015 at 3:35 PM, Sean DuBois <s...@siobud.com> wrote:

> On Wed, Sep 23, 2015 at 02:16:39PM -0700, j adams wrote:
> > Not my intention to be combative, but what about
> http://php.net/pcntl_fork
> > ? I've used that before in a robust distributed application that runs
> > without any intervention for months. It's my understanding that PHP is
> > thread safe, but not itself multithreaded. I believe there are some
> > extensions which aren't thread safe. Also correct me if I'm wrong but
> > Apache 2 should be run in it's prefork mode when using PHP.
> >
> > Also, any thoughts on my other questions? Sorry if I'm pressing my luck
> but
> > they are far more pressing for me currently:
> > 1) Is there not any way to first iterate through the default properties
> and
> > then iterate through *only the dynamic properties* ?
> > zend_object->properties appears to contain ALL properties if the object
> has
> > a single dynamically-assigned property.  If so, please advise?  If not,
> it
> > sounds like I must iterate through all properties and check each
> property's
> > key to see if it's included among the default properties. Please confirm?
> > 2) Will this code ALWAYS return the properties in the same sequence?
> E.g.,
> > if I am iterating through N objects of type MyClass, will each instance
> > iterate the properties in the same order?
> > 3) Will this code ALWAYS iterate over default properties (i.e., "sealed"
> > properties, those explicitly defined by class definitinos) FIRST and then
> > iterate any dynamically assigned properties?
> > These questions are very important for my serialization algorithm.
> >
> > CODE:
> >
> >
> >             zobj = zend_objects_get_address(*val TSRMLS_CC);
> >
> >             if (!zobj->properties) {
> >                 php_printf("***No dynamic properties!\n");
> >             } else {
> >                 php_printf("***we got dynamic properties...sadly, this
> will
> > also iterate through default properties too\n");
> >                 zend_hash_internal_pointer_reset_ex(zobj->properties,
> &pos);
> >                 while (zend_hash_get_current_data_ex(zobj->properties,
> > (void **) &value, &pos) == SUCCESS) {
> >                     if (zend_hash_get_current_key_ex(zobj->properties,
> > &key, &key_len, &num_index, 0, &pos) == HASH_KEY_IS_STRING) {
> >                         if (zend_check_property_access(zobj, key,
> key_len-1
> > TSRMLS_CC) == SUCCESS) {
> >
> >                             zend_unmangle_property_name(key, key_len - 1,
> > &class_name, &prop_name);
> >
> >                             php_printf("dynamic property is %s, key_len
> is
> > %d\n", prop_name, key_len);
> >                         }
> >                     }
> >                     zend_hash_move_forward_ex(zobj->properties, &pos);
> >                 }
> >             }
> >
> > On Wed, Sep 23, 2015 at 1:33 PM, Rowan Collins <rowan.coll...@gmail.com>
> > wrote:
> >
> > > On 23 September 2015 20:48:33 BST, j adams <zardozro...@gmail.com>
> wrote:
> > > >> PHP uses an object store.
> > > >Am I correct in understanding that the object store is a global data
> > > >structure? Wouldn't this tend to discourage any attempts at
> > > >multithreading/multiprocessing within one's PHP script--unless the
> > > >object
> > > >store is protected by a lock...
> > >
> > > PHP is inherently single-threaded as far as the user is concerned.
> There
> > > are many things which would break if you changed that.
> > >
> > > The only way I know of to write multi-threaded PHP is using the
> pthreads
> > > extension, which comes with some rather large caveats, and uses
> specific
> > > objects to communicate between threads.
> > >
> > > Regards,
> > > --
> > > Rowan Collins
> > > [IMSoP]
> > >
> > >
> > > --
> > > PHP Internals - PHP Runtime Development Mailing List
> > > To unsubscribe, visit: http://www.php.net/unsub.php
> > >
> > >
>
> In PHP7 this is how you can all the default properties (defined on the
> class) you will have to adjust. This is breaking public APIs, but just
> to illustrate how to get you closer.
>
> You should then be able to determine if a property is defined on the class
> or object this way.
> Just build some sort of lookup table via looping over them below.
>
>
> <code>
> PHP_FUNCTION(print_properties)
> {
>     zval *obj_zval;
>     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &obj_zval)
> == FAILURE) {
>         RETURN_FALSE;
>     }
>
>     zend_class_entry *ce = Z_OBJCE_P(obj_zval);
>     zend_property_info *prop;
>     zval *val;
>     int prop_count = 0;
>     const char *class_name, *prop_name;
>
>     ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop) {
>         val = &ce->default_properties_table[prop_count];
>         zend_unmangle_property_name(prop->name, &class_name, &prop_name);
>         prop_count++;
>
>         fprintf(stdout, "%s \n", prop_name);
>       php_var_dump(val, 1);
>     } ZEND_HASH_FOREACH_END();
> </code>
>
> Which will give you the following
>
> <script>
>
> <?php
>
> class SeanTest {
>   public $defaultPropertyPublic = 'publicDefaultProp';
>   private $defaultPropertyPrivate = 'privateDefaultProp';
>   protected $defaultPropertyProtected = 12;
>
> }
>
> $foo = new SeanTest();
>
> $foo->runtimeProperty = 3;
>
> print_properties($foo);
>
> </script>
>
>
> <output>
> defaultPropertyPublic
> string(17) "publicDefaultProp"
> defaultPropertyPrivate
> string(18) "privateDefaultProp"
> defaultPropertyProtected
> Int(12)
> </output>
>

Reply via email to