gc_collect_cycles() may interfere with using foreach to iterate objects

XMLWordPrintableJSON

    • Type: Bug
    • Resolution: Unresolved
    • Priority: Minor - P4
    • None
    • Affects Version/s: None
    • Component/s: None
    • None
    • None
    • PHP Drivers
    • Not Needed
    • Hide

      1. What would you like to communicate to the user about this feature?
      2. Would you like the user to see examples of the syntax and/or executable code and its output?
      3. Which versions of the driver/connector does this apply to?

      Show
      1. What would you like to communicate to the user about this feature? 2. Would you like the user to see examples of the syntax and/or executable code and its output? 3. Which versions of the driver/connector does this apply to?
    • None
    • None
    • None
    • None
    • None
    • None

      As reported in mongodb/mongo-php-driver#1776, calling gc_collect_cycles() may impact how properties of PHPC objects are reported when using foreach.

      To test this, I modified php_phongo_objectid_get_properties_hash() to print the value of is_temp each time it is called. I then ran the following:

      <?php
      
      $oid = new MongoDB\BSON\ObjectId;
      
      echo "foreach ObjectId:\n";
      foreach ($oid as $k => $v) {
      	printf("%s: %s\n", $k, $v);
      }
      
      printf("\ngc_collect_cycles: %d\n", gc_collect_cycles());
      
      echo "\nforeach ObjectId:\n";
      foreach ($oid as $k => $v) {
      	printf("%s: %s\n", $k, $v);
      }
      
      echo "\nvar_dump() ObjectId:\n";
      var_dump($oid);
      
      echo "\nget_object_vars() ObjectId\n";
      var_dump(get_object_vars($oid));
      

      Output:

      foreach ObjectId:
      php_phongo_objectid_get_properties_hash is_temp: 0
      php_phongo_objectid_get_properties_hash is_temp: 0
      oid: 67a0e8dcff929c245f0786c0
      php_phongo_objectid_get_properties_hash is_temp: 0
      
      gc_collect_cycles: 0
      
      foreach ObjectId:
      
      var_dump() ObjectId:
      php_phongo_objectid_get_properties_hash is_temp: 1
      object(MongoDB\BSON\ObjectId)#1 (1) {
        ["oid"]=>
        string(24) "67a0e8dcff929c245f0786c0"
      }
      
      get_object_vars() ObjectId
      php_phongo_objectid_get_properties_hash is_temp: 0
      array(1) {
        ["oid"]=>
        string(24) "67a0e8dcff929c245f0786c0"
      }
      

      var_dump() calls the get_debug_info handler, which sets is_temp: true, as expected. get_object_vars() uses the get_properties handler, which is also expected.

      It is unclear why the first foreach calls the get_properties handler three times, and then omits it entirely after the call to gc_collect_cycles.

              Assignee:
              Jeremy Mikola
              Reporter:
              Jeremy Mikola
              Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

                Created:
                Updated: