[ 
https://issues.apache.org/jira/browse/THRIFT-342?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13018442#comment-13018442
 ] 

Jake Farrell commented on THRIFT-342:
-------------------------------------

Instead of SplObjectStorage why not just add a check for is_scalar($elem) and 
keep the use of array keys as the set elements as we currently have.  If a 
non-scalar type is detected then we can use the list version. This does not 
resolve the possibility of duplicates for objects within a php "set", but I 
think putting that responsibility for uniqueness on the user is acceptable. 

David, Bryan thoughts on this?

> PHP: can't have sets of complex types
> -------------------------------------
>
>                 Key: THRIFT-342
>                 URL: https://issues.apache.org/jira/browse/THRIFT-342
>             Project: Thrift
>          Issue Type: Bug
>          Components: PHP - Compiler, PHP - Library
>         Environment: SVN trunk r743881
>            Reporter: David Sklar
>         Attachments: thrift-342.patch
>
>
> A setup like this:
> struct alice {
>   1: string bob
> }
> and another like this:
> struct charlie {
>    1: set<alice> david
> }
> causes problems because the generated PHP code looks like:
> ==
>         case 1:
>           if ($ftype == TType::SET) {
>             $this->david = array();
>             $_size0 = 0;
>             $_etype3 = 0;
>             $xfer += $input->readSetBegin($_etype3, $_size0);
>             for ($_i4 = 0; $_i4 < $_size0; ++$_i4)
>             {
>               $elem5 = null;
>               $elem5 = new alice();
>               $xfer += $elem5->read($input);
>               $this->david[$elem5] = true;
>             }
>             $xfer += $input->readSetEnd();
>           } else {
>             $xfer += $input->skip($ftype);
>           }
>           break;
> ===
> Using objects as array keys makes PHP cranky and the values can not be 
> properly set. I think the solution to this is either:
> 1. Document that the PHP bindings do not support sets of complex types. 
> (boooo!)
> 2. Modify the generated code so that the values are stored in array values 
> not keys. (With some additional checks to ensure uniqueness, or perhaps just 
> using spl_object_hash($theObject) as the array key.
> This seems similar to the issues raised in THRIFT-231 and THRIFT-162
>               $this->david[$elem5] = true;

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to