php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #17732 decode_request - reference vars depracated
Submitted: 2002-06-12 17:50 UTC Modified: 2003-06-25 13:06 UTC
From: ramses0 at yahoo dot com Assigned:
Status: Closed Package: XMLRPC-EPI related
PHP Version: 4.1.2 OS: Linux
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: ramses0 at yahoo dot com
New email:
PHP Version: OS:

 

 [2002-06-12 17:50 UTC] ramses0 at yahoo dot com
Using the following demonstration RPC request, the
function xmlrpc_decode_request (apparently) does not
correctly update the passed in parameter $method_name,
as described in the documentation on:
http://xmlrpc-epi.sourceforge.net/main.php?t=php_api

On a hunch, I tried changing the call to:   
  xmlrpc_decode_request($xml, &$method); 
to use call-time pass by reference. It then worked, 
but call time pass by reference is depracated:

Warning: Call-time pass-by-reference has been
deprecated - argument passed by value; If you would
like to pass it by reference, modify the declaration of
xmlrpc_decode_request(). If you would like to enable
call-time pass-by-reference, you can set
allow_call_time_pass_reference to true in your INI
file. However, future versions may not support this any
longer.

As an aside- it appears that you cannot "swallow" the warning by doing an $results = @decode( $a, &$b )... 
it stil gives the "warning, depracated" message.  So
that is possibly another bug.  I have grepped through
the source trees somewhat, but couldn't find much examples
of functions directly affecting their passed in values 
(except "sort", which is pretty complicated).

Thanks-

--Robert
(bugreport is mirrored at the sf.net pages, but that
 area appears to be mildly unmaintained)
 

<?php
$request = <<< END
<?xml version="1.0"?>
<methodCall>
<methodName>greeting</methodName>
<params>
<param>
<value><string>Dan</string></value>
</param>
</params>
</methodCall>
END;
// <?
/* ** DEBUGGING INFORMATION ** */
echo "<pre>";
echo "<b>Request:</b><br>";
print_r( $request );

// decode the request
$method_name = '';
$stuff = xmlrpc_decode_request( $request, $method_name );

echo "<b>Results:</b><br>";
print_r( $stuff );

echo "<b>Method:</b><br>";
print_r( $method_name );
echo "</pre>";
?>

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2002-06-15 22:24 UTC] sniper@php.net
This bug has been fixed in CVS. You can grab a snapshot of the
CVS version at http://snaps.php.net/. In case this was a documentation 
problem, the fix will show up soon at http://www.php.net/manual/.
In case this was a PHP.net website problem, the change will show
up on the PHP.net site and on the mirror sites.
Thank you for the report, and for helping us make PHP better.


 [2003-06-25 12:44 UTC] scott at executebusiness dot com
Can someone suggest why this is deprecated? I haven't found any reason for allow_call_time_pass_reference deprecation. Far as I can tell using byref is a good idea in programming to save cpu time when passing large vars.
 [2003-06-25 13:06 UTC] ramses0 at yahoo dot com
Consider the function (please forgive the incorrect math):

  function convert( $num ) {
    $num = $num + 32;
    $num = $num * (5/9);
    return( $num );
  }

What is expected behaviour of this:
  $n = 10;
  $z = convert( $n );
  print "$n, $z";

...or:
  $n = 10;
  $z = convert( &$n );
  print "$n, $z";

...should they print the same thing?  The second is "call time pass by reference".

And FYI: As I have been told, PHP uses "copy on write, pass by reference" by default anyway.

So, if you have this example scenario:
  $shakespeare = "To be or not to be, etc, etc, etc, etc";
  spellcheck( $shakespeare );

...then the function shakespeare only makes a copy of that big long string if it makes a modification.  Example:
  function spellcheck( $text ) {
    if( strstr( $text, "teh" ) ) { return FALSE; }
    return TRUE;
  }
...this function should not make that huge copy (php is magic).   This one would:
  function spellcheck( $text ) {
    $text[0] = "!";
    if( strstr( $text, "teh" ) ) { return FALSE; }
    return TRUE;
  }
...because PHP needs to keep track that the string has been modified.  Ask on the mailing lists if you really care (php-user, probably).  :^)
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sun Dec 22 02:01:28 2024 UTC