|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2010-02-23 18:41 UTC] richard at rjharrison dot org
Description:
------------
class_exists() is not calling my spl_autoload_register'ed function with a fully qualified (namespaced) class name.
Because the input to my autoload function is not fully qualified, it cannot load the class and class_exists return false; however, if I try to instantiate the class that "does not exist" then the correct, fully qualified class now passed to the autoloader: it correctly loads the class and my code works.
Reproduce code:
---------------
// register my autoloader
use Foo\Things;
// This fails: my autoload function is called with $class = 'Things\Car'
if(class_exists('Things\Car')){
echo "class exists!";
}else{
echo "Weird?";
}
// This works: my autoload function is called with $class = 'Foo\Things\Car'
$x = new Things\Car();
Expected result:
----------------
"class exists!"
Actual result:
--------------
"Weird?"
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Wed Dec 03 04:00:02 2025 UTC |
Hi Johannes, I double-checked the documentation and found no mention that the string passed to class_exists() must be fully qualified. Perhaps this is a documentation bug. It is certainly seems inconsistent/counter-intuitive:- class_exists('Things\Car'); // FALSE, class does not exist $car = new Things\Car(); // HUH? Class does exist after all So PHP is able to figure out there is a "use Foo/Things" namespace in effect on one line, but not on the other? Lame.I have a very similar problem, not with class exists, but with dynamic instantiation: return ($dynamic? new $className : new SelectMysql); I can fix it concatenating __NAMESPACE__, but it seems weird that PHP cannot determine this. Here's a working example: Select.php <?php namespace sql; abstract class Select { abstract function limit($limit, $offset); static function factory($dynamic = true) { $className = "SelectMysql"; return ($dynamic? new $className : new SelectMysql); } } ?> SelectMysql.php <?php namespace sql; class SelectMysql { function limit($limit, $offset) { return; } } ?> test.php <?php include('Select.php'); include('SelectMysql.php'); // this works $select = sql\Select::factory(true); // this does not $select = sql\Select::factory(true); ?>