Edit report at https://bugs.php.net/bug.php?id=51126&edit=1

 ID:                 51126
 Comment by:         php dot net at jluis dot com dot ar
 Reported by:        richard at rjharrison dot org
 Summary:            class_exists + namespaces
 Status:             Not a bug
 Type:               Bug
 Package:            SPL related
 Operating System:   linux
 PHP Version:        5.3.1
 Block user comment: N
 Private report:     N

 New Comment:

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);

?>


Previous Comments:
------------------------------------------------------------------------
[2011-10-10 10:37:50] dmittner at llnw dot com

I agree that this behavior is counter-intuitive. I seem to have just run into 
the same problem, myself, where my autoload works just fine where 
class_exists() returns false.

In short... class_exists() should really infer the given namespace of the 
current file, just like it's inferred in all other uses.

------------------------------------------------------------------------
[2010-02-23 19:02:17] richard at rjharrison dot org

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.

------------------------------------------------------------------------
[2010-02-23 18:46:01] johan...@php.net

Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php

When used as a string we need the fully qualified name as we don't know where 
the parameter is coming from.

------------------------------------------------------------------------
[2010-02-23 18:41:57] 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?"


------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=51126&edit=1

Reply via email to