__autoload() not called with reflectionProperty->getClass()
| Bug #29268 | __autoload() not called with reflectionProperty->getClass() | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Submitted: | 2004-07-19 23:12 UTC | Modified: | 2005-10-21 10:04 UTC |
|
||||||||||
| From: | david at jool dot nl | Assigned: | dmitry (profile) | |||||||||||
| Status: | Closed | Package: | Scripting Engine problem | |||||||||||
| PHP Version: | 5.0.0 | OS: | winXP | |||||||||||
| Private report: | No | CVE-ID: | None | |||||||||||
[2004-07-19 23:12 UTC] david at jool dot nl
Description: ------------ When creating a new instance of a class inside eval() the __autoload function isn't called.
Patches
Pull Requests
History
AllCommentsChangesGit/SVN commits
[2005-01-15 17:21 UTC] david at jool dot nl
I took another look at the bug and found out it's more a reflectionProperty bug: -- File 'A.class.php' <?PHP class A{ } ?> -- File test.php in the same directory <?php /** autoload functie voor PHP5 */ function __autoload($classname) { if(file_exists("$classname.class.php")) include("$classname.class.php"); } //When you include the following line, it works //include("A.class.php"); class B{ public function doit(A $a){ } } $ref = new reflectionMethod('B','doit'); $parameters = $ref->getParameters(); foreach($parameters as $parameter){ //the following line give the error $class = $parameter->getClass(); echo $class->name; } ?> --Expected result 'A' -- Actual result Fatal error: Uncaught exception 'ReflectionException' with message 'Class A does not exist'[2005-01-15 17:59 UTC] david at jool dot nl
A possible solution might be to also check if zend_fetch_class() also returns null, next to zend_hash_find(). I'm not able to compile it myself, but the fix might be to change line 1703 in zend_reflection_api.c from if (zend_hash_find(EG(class_table), lcname, param->arg_info->class_name_len + 1, (void **) &pce) == FAILURE) { to if (zend_hash_find(EG(class_table), lcname, param->arg_info->class_name_len + 1, (void **) &pce) == FAILURE && zend_fetch_class(lcname, (param->arg_info->class_name_len + 1), ZEND_FETCH_CLASS_AUTO TSRMLS_CC) == NULL) {[2005-03-14 01:00 UTC] php-bugs at lists dot php dot net
[2005-10-12 05:33 UTC] php at mfn dot de
I still encounter this bug in PHP 5.1.0RC1 on Win2k, also in snapshot from Oct 12, 2005 02:30 GMT. Here's a shorter reproduce code: function foo(Bar $bar) {} function __autoload($c) { class bar {} } $RF = new ReflectionFunction('foo'); foreach($RF->getParameters() as $param) { var_dump($param->getClass()); }[2005-10-21 01:26 UTC] david at jool dot nl