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