Edit report at https://bugs.php.net/bug.php?id=55475&edit=1
ID: 55475 Updated by: ka...@php.net Reported by: mads at gartneriet dot dk Summary: is_a() triggers autoloader Status: Assigned Type: Bug Package: Scripting Engine problem PHP Version: 5.3.7 Assigned To: dmitry Block user comment: N Private report: N New Comment: Zeev, although the functionality might appear as it should be then we should not make sudden changes like that in the middle of a stable branch, we should patch up 5.3 and keep the behaviour in 5.4 if its indeed intended atleast to comply with previous versions. The fix for 5.3 is simple, attached Previous Comments: ------------------------------------------------------------------------ [2011-08-22 10:12:48] z...@php.net Discussed with Dmitry, the current functionality appears to be correct. is_a('foo', 'bar') *can* be true even if class foo isn't loaded, and we'll only know that if we try to load 'foo'. This is different from is_a($obj, 'non_existent_class'), which we can resolve as 'false' in case non_existent_class isn't loaded without trying to load it (there can't be an instance of a class that doesn't exist). ------------------------------------------------------------------------ [2011-08-22 09:15:23] col...@php.net 1) The underlying implementation is shared between is_a and is_subclass_of. 2) Previously, strings as first argument was not permitted by is_a but was for is_subclass_of, 3) is_subclass_of always triggered autoload in such cases. 4) Following a fix from Dmitry, the underlying implementation now allows a string as first argument for is_a as well. Conclusion: it is now consistent, but if you wrongly used is_a with a string before, it now triggers autoload because it actually accepts it. ------------------------------------------------------------------------ [2011-08-22 08:57:32] konstantin dot leboev at gmail dot com I guess it's not a bug. The first argument can be a class name, what will be loaded only on calling this function. ------------------------------------------------------------------------ [2011-08-22 08:19:04] paj...@php.net Related to change for the #53727 fix. http://svn.php.net/viewvc/php/php- src/branches/PHP_5_3/Zend/zend_builtin_functions.c?r1=307522&r2=312904 Assigned to Dmitry ------------------------------------------------------------------------ [2011-08-22 08:16:02] mads at gartneriet dot dk Description: ------------ When calling is_a() with a first argument that is not an object, then __autoload() is triggered: Test script: --------------- <?php function __autoload($class) { echo "Would load: " . $class . PHP_EOL; } $var = "test"; var_dump(is_a($var, 'B')); $obj = new Stdclass; var_dump(is_a($obj, 'C')); ?> Expected result: ---------------- bool(false) bool(false) Actual result: -------------- Would load: test bool(false) bool(false) ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=55475&edit=1