-
Type:
Bug
-
Resolution: Unresolved
-
Priority:
Minor - P4
-
None
-
Affects Version/s: None
-
Component/s: None
-
None
-
None
-
PHP Drivers
-
Not Needed
-
-
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.