|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2009-08-11 07:18 UTC] virgilp at gmail dot com
Description: ------------ There are several things that go wrong with reflection on MySqli. 1. First and foremost - extracting mysqli::bind_param signature yields strange results: public function bind_param($); And the parameter in question (printed as "$") is in fact: ReflectionParameter::__set_state(array( 'name' => NULL, )) /// Null name!! I believe this is actually related to bug #45578 - but that one has been closed as being related to something completely different. 2. another odd thing is that reflection returns "final protected class mysqli_warning " (and a class can't be "protected"). 3. Several properties seem to be completely missing from reflection - e.g. the "host_info" property of mysqli. 4. Parameters are not shown in member methods - e.g. mysqli::prepare is shown to have 0 parameters (when in fact, it receives a string parameter). Reproduce code: --------------- $ext = new ReflectionExtension('mysqli'); $class_arr = $ext->getClassNames(); foreach($class_arr as $cls_name){ DumpClass($cls_name); } // I could give the implementation of DumpClass if needed, but it's straight out of the "reflection" examples, it prints the modifiers, class name, "extends", "implements" & properties/methods Expected result: ---------------- MySqli class seen through reflection the same way as it is documented on www.php.net Actual result: -------------- Wrong output from reflection (as listed in "description") PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Thu Oct 30 22:00:01 2025 UTC |
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".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.