#49216 [Fbk->Opn]: Reflection doesn't seem to work properly on MySqli

From: Date: Wed, 09 Sep 2009 17:10:41 +0000
Subject: #49216 [Fbk->Opn]: Reflection doesn't seem to work properly on MySqli
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-142166@lists.php.net to get a copy of this message
ID: 49216 User updated by: virgilp at gmail dot com Reported By: virgilp at gmail dot com -Status: Feedback +Status: Open Bug Type: Reflection related Operating System: Windows XP SP3 PHP Version: 5.2.10 New Comment: 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". Previous Comments: ------------------------------------------------------------------------ [2009-09-02 19:25:29] jani@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? ------------------------------------------------------------------------ [2009-08-12 07:04:06] virgilp at gmail dot com I tried http://windows.php.net/downloads/snaps/php-5.2-nts-win32-VC6-x86- latest.zip - I get the same behaviour ------------------------------------------------------------------------ [2009-08-11 07:18:28] 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") ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=49216&edit=1

« previous php.bugs (#142166) next »