Edit report at http://bugs.php.net/bug.php?id=49216&edit=1

 ID:               49216
 Updated by:       and...@php.net
 Reported by:      virgilp at gmail dot com
 Summary:          Reflection doesn't seem to work properly on MySqli
 Status:           Assigned
 Type:             Bug
 Package:          MySQLi related
 Operating System: Windows XP SP3
 PHP Version:      5.2.10
 Assigned To:      mysql

 New Comment:

working on this, needs arginfo here and there. Will be, however only
5.3+


Previous Comments:
------------------------------------------------------------------------
[2009-09-10 12:33:14] virgilp at gmail dot com

I found something interesting.

As it turns out, you may need to "refine" the php.net site... the code 

written there seems to be no good, according to your latest feedback - 

because it works just like my example:

http://www.php.net/~helly/classbrowser/class.php?

class=mysqli_stmt&extension=mysqli



And there are others, too, for instance this one:

http://www.php.net/~helly/classbrowser/class.php?

class=DOMErrorHandler&extension=dom

(probably not a reflection bug either, just an unrefined "class.php" 

page)

------------------------------------------------------------------------
[2009-09-09 17:26:37] virgilp at gmail dot com

Oh, and about your supposition that I need an actual object... that's 

not true, either. Try this:

=======================

$mysqli = mysqli_init();

if (!$mysqli) {

    die('mysqli_init failed');

}



if (!$mysqli->options(MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT = 0')) {

    die('Setting MYSQLI_INIT_COMMAND failed');

}



PrintParams('MySqli','options');

======================



With the PrintParams function being the one from my previous example. 

I get the following output:

-----------------------

$ php.exe d.php

MySqli::options():

-----------------------



Surprise-surprise, it does get to PrintParams (meaning that it doesn't 

die, and I did successfully create a MySqli object). But what do you 

know, the "options" function still shows as being one with no 

parameters. So maybe they were optional parameters? Nope, this is what 


I get if I give no parameters:



Warning: mysqli::options() expects exactly 2 parameters, 0 given



As it turns out, it doesn't matter if you created one MySqli object... 

the reflection is still buggy.

------------------------------------------------------------------------
[2009-09-09 17:20:30] virgilp at gmail dot com

Just to clarify - the previous program shows the following results on 

my machine:

====================================================

MySqli_stmt::bind_param():

Parameter #0 [ <required> $param0 ] :

SoapClient::__call():

Parameter #0 [ <required> $param0 ] :

Parameter #1 [ <required> $param1 ] :

SoapClient::__soapCall():

Parameter #0 [ <required> $function_name ] : function_name

Parameter #1 [ <required> $arguments ] : arguments

Parameter #2 [ <optional> $options ] : options

Parameter #3 [ <optional> $input_headers ] : input_headers

Parameter #4 [ <optional> &$output_headers ] : output_headers

===============================================



Notice that bind_param, as well as SoapClient::__call do not return 

any "name" for the parameters (although printing the parameter 

directly will show a name). In contrast with that - _soapCall will 

correctly show the names

------------------------------------------------------------------------
[2009-09-09 17:10:40] virgilp at gmail dot com

1. You forgot about the "protected class" mysqli_warning.



2. Then run the following program, and explain its results. I added 

mysqli_stmt only for reference, so that you see the similarity:



<?

function PrintParams($classname, $methodname){

   $class = new ReflectionClass($classname);

   $method= $class->getMethod($methodname);

    echo "$classname::$methodname():\n";

   $parameters = $method->getParameters();

  foreach ($parameter as $param)

  {

    echo "$param : ".$param->getName()." \n";



  }

}



PrintParams('MySqli_stmt','bind_param');

PrintParams('SoapClient','__call');

PrintParams('SoapClient','__soapCall');



?>



3. furthermore - new reflection issues, not really related to MySqli: 

a bunch of interfaces have no extension associated. For example try 

php.exe --rc RecursiveIterator -you'll see that it prints 

<internal:SPL> (which is probably correct). But php.exe --rc Iterator, 

or php.exe --rc ArrayAccess will print only <internal>. 

Coincidentally, this means that you can't find the "Iterator" 

interface in any extension (e.g. using 

ReflectionExtesions::GetClasses) - IMO, it should be either in "SPL" 

or in "standard", but not completely "missing".

------------------------------------------------------------------------
[2009-09-02 19:25:29] j...@php.net

host_info and such is only there when you actually have connected 

somewhere. How about you refine your report and try with an actual 

object first?

------------------------------------------------------------------------


The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at

    http://bugs.php.net/bug.php?id=49216


-- 
Edit this bug report at http://bugs.php.net/bug.php?id=49216&edit=1

Reply via email to