You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@thrift.apache.org by Oleg Grenrus <ph...@gmail.com> on 2010/06/01 14:03:58 UTC

thrift_protocol php-extension taking arguments by-reference

Hi,

recently we encountered a problem with thrift_protocol PHP-extension:
it takes parameters "by-reference" and casts them into proper types.

Probably example will explain what is possibly wrong:

<?php
$str = 100;
var_dump($str);
echo rtrim($str), "\n"; // expects string
var_dump($str);
?>

and output is as expected, type of $str isn't changed

int(100)
100
int(100)


But consider we have Thrift service with function specified as:

void foo(1:string s)

and we use it similarly

<?php
// ... initialize thrift
$str = 100;
var_dump($str);
$client->foo($str);
var_dump($str);
?>

results

int(100)
string(3) "100"

=> type of $str is changed!

I looked through the extension code and there's convert_to_* calls on the input
variables, which causes this suprising behaviour. I also tried to replace
convert_to_* calls in binary_serialize with _ex counterparts, but something
went completely wrong.

Is this expected behaviour or should this be considered as a bug?


-- 
Oleg Grenrus

Re: thrift_protocol php-extension taking arguments by-reference

Posted by Anner van Hardenbroek <dw...@users.sourceforge.net>.
Hi,

I consider this behavior a bug because I'm surprised when it happens. Because PHP 'normally' does implicit type casting and most functions don't use referenced arguments, I assume the argument I pass to the service function won't change, because this will happen in most of the cases.

But when I pass a variable to a function like settype(), I assume that this will change the type, because it's the nature of the function to do so. Also when I'm using a function like system(), it makes sense to have a referenced output variable, because the nature of the function dictates that the output variable will be filled with the output of the executed command.

I don't know why references are used, but it I guess they are cheaper, performance and memory wise.

Kind regards,
- Anner.

--
Anner van Hardenbroek
dwlnetnl@users.sourceforge.net

On 1 jun 2010, at 14:03, Oleg Grenrus wrote:

> Hi,
> 
> recently we encountered a problem with thrift_protocol PHP-extension:
> it takes parameters "by-reference" and casts them into proper types.
> 
> Probably example will explain what is possibly wrong:
> 
> <?php
> $str = 100;
> var_dump($str);
> echo rtrim($str), "\n"; // expects string
> var_dump($str);
> ?>
> 
> and output is as expected, type of $str isn't changed
> 
> int(100)
> 100
> int(100)
> 
> 
> But consider we have Thrift service with function specified as:
> 
> void foo(1:string s)
> 
> and we use it similarly
> 
> <?php
> // ... initialize thrift
> $str = 100;
> var_dump($str);
> $client->foo($str);
> var_dump($str);
> ?>
> 
> results
> 
> int(100)
> string(3) "100"
> 
> => type of $str is changed!
> 
> I looked through the extension code and there's convert_to_* calls on the input
> variables, which causes this suprising behaviour. I also tried to replace
> convert_to_* calls in binary_serialize with _ex counterparts, but something
> went completely wrong.
> 
> Is this expected behaviour or should this be considered as a bug?
> 
> 
> -- 
> Oleg Grenrus